正则表达式只匹配一次

时间:2015-02-25 14:31:44

标签: php html regex

我有一个正则表达式重写[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);

一个工作示例是https://www.regex101.com/r/mJ9sM0/1

3 个答案:

答案 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

+将匹配一个或多个匹配项。结合?,它将尽可能匹配(懒惰)。