我有一个正则表达式应重写[img]foo.bar[/img]
到<img src=foo.bar>
,事实上,它确实如此。当我在字符串中有两个或更多[img]url.ext[/img]
时,会出现问题。它不是单独匹配每个匹配,而是匹配第一个[img]
和最后一个[/img]
,并将网址和标记留在中间作为src
的一部分。我的PHP代码是$newstring = preg_replace('%\[img\](.+)\[/img\]%', '<img src=${1}>', $string);
答案 0 :(得分:4)
+
运算符默认为greedy,您需要使用+?
进行非贪婪匹配。
$str = preg_replace('~\[img]\s*(.+?)\s*\[/img]~i', '<img src="$1">', $str);
注意:我提出上述建议 - 推荐i
标志用于不区分大小写的匹配。
答案 1 :(得分:3)
正则表达式为greedy by default。试试non-greedy regex,即
preg_replace('%\[img\](.+?)\[/img\]%', '<img src=${1}>', $string);
(请注意?
之后的+
。)
答案 2 :(得分:3)
使用+?
代替+
进行非贪婪匹配。
\[img\](.+?)\[/img\]
演示https://www.regex101.com/r/zW9zJ0/1
+
将匹配一个或多个匹配项。结合?
,它将尽可能匹配(懒惰)。