我正在尝试找到符合
的任何内容<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
所以看起来,由于某种原因,它只会发生一次。任何想法都会非常感激,我花了三个多小时阅读并摸不着头脑!
答案 0 :(得分:1)
问题是.*
贪婪。看一下这种模式/foo.*bar/
和以下文字
foo hello bar world bar
由于最后.*
,hello bar world
与bar
匹配。
要更改此行为,您只需添加?
,因此模式将如下所示
|<.*?bentleysoft-widget="([a-z]+)"></.*?>|
它应该有效
此外,由于您要捕获正确的结束标记,因此您应该使用backreference此处
|<(\S+?).*?bentleysoft-widget="([a-z]+)"></\\1>|
(\S+?)
会为您提供正确的标记名称(因为\S
匹配除空白之外的所有内容),可以通过\\1
反向引用(1因为它是第一个组)。