PHP 正则表达式preg_match_all贪婪的修饰符


PHP regex preg_match_all greedy modifier

这是我的代码:

echo "<br />";
preg_match_all("|<[^>]+>.*</[^>]+>|U",
    "<b>example:</b><strong>this is a test</strong>",
    $out, PREG_PATTERN_ORDER);
print_r($out);
echo "<br />";
echo "<br />";
preg_match_all("|<[^>]+>.*</[^>]+>|",
    "<b>example:</b><strong>this is a test</strong>",
    $out, PREG_PATTERN_ORDER);
print_r($out);
echo "<br />";

有些事情我不明白。当正则表达式末尾有一个 U 时有什么区别?

输出为:

数组 ( [0] => 数组 ( [0] => 示例: [1] => 这是一个测试 ) )

数组 ( [0] => 数组 ( [0] => 示例:这是一个测试 ) )

那么这里到底发生了什么?哪个版本是贪婪版本,为什么?

U 告诉你的正则表达式是"不贪婪"。贪婪意味着尽可能多地匹配,而"不贪婪"只接受最小的匹配。

所以在贪婪的例子中,你的匹配是:

<b>example:</b><strong>this is a test</strong>

我假设 html 标签"</b><strong>"在您输出时或已经被preg_match剥离。

相比之下,不贪婪的人通过像这样匹配来做你想做的事:

<b>example:</b>, <strong>this is a test</strong>

编辑:

要使用 ? 实现类似的匹配,您可以执行以下操作:

preg_match_all("|<[^>/]+>.*?</[^>]+>|",
    "<b>example:</b><strong>this is a test</strong>",
    $out, PREG_PATTERN_ORDER);
print_r($out);

这是因为.*?会尝试将标记之间的内容限制为尽可能短(不贪婪),因此再次导致两个匹配项。