正则表达式只匹配一次

3
我有一个正则表达式,它应该将[img]foo.bar[/img]重写为<img src=foo.bar>,实际上也确实实现了这一点。但问题在于,如果字符串中有两个或更多的[img]url.ext[/img],它不会单独匹配每个标签,而是匹配第一个[img]和最后一个[/img],并将中间的 URL 和标签作为src的一部分。我的 PHP 代码如下:$newstring = preg_replace('%\[img\](.+)\[/img\]%', '<img src=${1}>', $string); 一个可工作的示例网址是:https://www.regex101.com/r/mJ9sM0/1

可能是重复的问题,与正则表达式匹配一个开放和关闭标签以及该标签内特定文本模式有关。 (https://dev59.com/VVjUa4cB1Zd3GeqPQE09) - NeronLeVelu
3个回答

4
默认情况下,+ 运算符是 贪婪的,你需要使用 +? 来进行非贪婪匹配。
$str = preg_replace('~\[img]\s*(.+?)\s*\[/img]~i', '<img src="$1">', $str);

注意:我建议以上内容——推荐使用i标志进行不区分大小写匹配。


4

使用+?代替+进行非贪婪匹配。

\[img\](.+?)\[/img\]

演示 https://www.regex101.com/r/zW9zJ0/1

+ 将匹配一个或多个出现次数。与?组合使用,它将尽可能少地匹配(懒惰模式)。


3

正则表达式默认为贪婪模式(greedy by default)。尝试使用非贪婪正则表达式(non-greedy regex),即

preg_replace('%\[img\](.+?)\[/img\]%', '<img src=${1}>', $string);

(注意在加号后面有一个 ?。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接