关于php中正则匹配包括换行符在内的任意字符的问题总结

时间:2023-03-08 16:44:21
关于php中正则匹配包括换行符在内的任意字符的问题总结

要使用正则匹配任意字符的话,通常有以下几种方法,这里我分别对每一种方法在使用的过程中做一个总结:

第一种方式:[.\n]*?
示例

? PHP
preg_match_all('/<div class="list">[.\n]*?<\/div>/i', $content, $data);

按道理这种方式应该是可以的,但我测试发现不行,因为这里中括号里面的“.”被当作一个普通的英文句号去处理了,而不是通配符,因此这里只能匹配到包含英语句号及换行符在内的任意内容了。

第二种方式:.*?
示例

? PHP
preg_match_all('/<div class="list">.*?<\/div>/is', $content, $data);

这种方式是没问题的,但要记得后面加的/s修正符。

第三种方式:(.|\n)*?
示例

? PHP
preg_match_all('/<div class="list">(?:.|\n)*?<\/div>/i', $content, $data);

与第一种方式相比,这里的“.”不会被当作普通字符处理,而是真正期望的通配符了,如此说来这种方式也没问题,但我在测试中发现,当要匹配的字符串 内容有点长的时候就不行了,再更换至高版本的php环境下去测试则正常,由此得出这应该跟php所绑定的PCRE库版本有关了。

第四种方式:[\s\S]*?
示例

? PHP
preg_match_all('/<div class="list">[\s\S]*?<\/div>/i', $content, $data);

这种方式完全没问题,我在windows及linux环境下测试都通过,在各个常见的php版本下测试也通过。

最后还有一点需要注意的是,linux环境下是有\n(换行符)而没有\r(回车符)的,而windows环境下通常是\r\n(回车换行)连在一起的,测试匹配时得留意这个细节差异。