0

这是我的代码:

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] => 示例:这是一个测试))

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

4

1 回答 1

2

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);

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

于 2013-01-23T17:50:41.907 回答