PCRE_MULTILINE“m”修饰符问题

时间:2011-06-16 22:41:44

标签: php regex pcre newline

同意'm'修改说明中的PHP Modiefers Reference说明:

当设置此修饰符时,“行首”和“行尾”构造分别在主题字符串中的任何换行符之后或之前立即匹配,以及在开头和结尾处匹配。

我正在学习正则表达式,这个例子有点不合理:

<?php echo preg_replace("/^[\s]*$/m","<p>","with.\n\n\n\t \nTherefor"); ?>

最终:

"with.\n<p>\nTherefor"

但我精神上说'^'和'$'元字符就像previusly说的那样。 (^,$ =想象位置)

^with.$\n^$\n^$\n^\t $\n^Therefor$

并阅读正则表达式: 行的开头是否跟随一个空格字符([\ t \ r \ n])后跟行尾。

但正则表达式引擎从第二个'^'到第四个'$'吃掉了'\ n'。 不应该这样吗?: (^,$ =想象位置)

^with.$\n
^(no space character)$\n
^(no space character)$\n
^(\t )$\n
^Therefor$


with.\n
<p>\n
<p>\n
<p>\n
Therefor

认为正则表达式向右运行。 为什么正则表达式似乎看起来'\ n'。 因为它匹配点^(没有空格字符)$然后跟随......'\ n'。

我不知道是否有人能理解我。 谢谢大家。

1 个答案:

答案 0 :(得分:1)

这个正则表达式似乎结合了多行......

但是你可以通过使用U修饰符xor将?添加到*来避免这种情况,这样它就不再贪婪了:

echo preg_replace("/^[\s]*$/mU","<p>","with.\n\n\n\t \nTherefor");
echo preg_replace("/^[\s]*?$/m","<p>","with.\n\n\n\t \nTherefor");