您当前的位置:首页 > 网站建设笔记 >

PHP正则表达式U修饰符详解

0

问题:希望模式与尽可能小的字符串匹配,而不是匹配最大的字符串。
解决方案:在量词后面加一个?来改变模式的这一部分。

使量词与尽可能少的字符匹配
查找所有<em>emphasized</em>
preg_match_all('@<em>.+?</em>@', $html, $matches);

或者使用U模式修饰符作为结尾将所有修饰符从贪婪匹配(与尽可能多的字符匹配)转换非贪婪匹配(与尽可能少的字符匹配)。

使量词与尽可能少的字符匹配
preg_match_all('@<em>.+</em>@U', $html, $matches);

贪婪匹配称为最大匹配(maximal matching),非贪婪匹配可以称为最小匹配(minimal matching),因为这些方法分别尽可能匹配最大或最小数目的字符。ereg()和ereg_replace()函数总是贪婪的。由于能选择采用贪婪或非贪婪匹配,这也是使用PCRE函数的另一个原因。尽管非贪婪匹配对于简单的HTML解析很有用,不过,如果标记不是百分之百合法(即使是合法的HTML也可能会有麻烦,例如,如果注释中有bold标记,真正的HTML解析器会忽略这些标记,不过我们的模式则无法做到。),其中存在不匹配的标记(例如只有单个的<em>标记),这就会出问题。如果你的目标只是从一个文本块删除所有或一些HTML标记,最好不要使用正则表达式。可以使用内置函数strip_tags(),这个函数速度更快,而且更正确。

最后,尽管非贪婪匹配的想法来自Perl,但是U修饰符与Perl并不兼容,这是PHP的Perl兼容正则表达式独有的特性。它会反转所有量词,将它们从贪婪匹配转换为非贪婪匹配,同时将非贪婪匹配转换为贪婪匹配。所以,对于一个末尾有/U的模式,要得到其中一个贪婪量词,只需要在量词后面增加一个?,采用同样的方法可以将一个贪婪量词转换为非贪婪量词。

顶部中部底部