这是我的代码:
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);
这是因为.*?
会尝试将标记之间的内容限制为尽可能短(不贪婪),因此再次导致两个匹配项。