PHP正则无法匹配出Html中内容的原因

用PHP正则匹配Html页面body中的内容,内容有很多行时就无法匹配出

preg_match('/<body>(.*)<\/body>/ui', $html, $matches);

关键出错就出在这个正则上面,网上google了一下,发现下面这个正则可用

preg_match('/<body>([\d\D]*?)<\/body>/ui', $html, $matches);

初看两个没什么不同,但经过仔细观察发现错误原来在“ . “这个点号匹配上,”.”匹配的是除了换行符(\n)之外的任何字符。html中自然有很多换行所以就导致匹配终止,出现0次匹配成功。查看PHP正则,在模式修正中有一个修正符“ s ” 是将整个匹配内容看成一行字符串。于是得出了正确的正则表达式:

preg_match('/<body>([\d\D]*?)<\/body>/uis', $html, $matches);

测试即可成功。果然败在了细节,手册之类的要看仔细,否则容易忽略某个致命细节。

One thought on “PHP正则无法匹配出Html中内容的原因”

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>