PHP preg_replace似乎只影响一个匹配

时间:2014-03-27 20:52:49

标签: php preg-replace

我正在尝试找到符合

的任何内容
<element ... bentleysoft-widget="mywidget" ...></element>

并用其他东西替换它。

我的实际字符串是:

$text = '<div id="joboftheday" bentleysoft-widget="joboftheday"></div><div id="adults" bentleysoft-widget="test"></div>';

我的preg_replace表达式是:

$output = preg_replace('|<.*bentleysoft-widget="([a-z]+)"></.*>|', 'zzz $1', $text, -1);

然而,我得到的是:

zzz test

所以看起来,由于某种原因,它只会发生一次。任何想法都会非常感激,我花了三个多小时阅读并摸不着头脑!

1 个答案:

答案 0 :(得分:1)

问题是.* 贪婪。看一下这种模式/foo.*bar/和以下文字

foo hello bar world bar

由于最后.*hello bar worldbar匹配。

要更改此行为,您只需添加?,因此模式将如下所示

|<.*?bentleysoft-widget="([a-z]+)"></.*?>|

它应该有效


此外,由于您要捕获正确的结束标记,因此您应该使用backreference此处

|<(\S+?).*?bentleysoft-widget="([a-z]+)"></\\1>|

(\S+?)会为您提供正确的标记名称(因为\S匹配除空白之外的所有内容),可以通过\\1反向引用(1因为它是第一个组)。