2014-03-27 24 views
0

PHP的preg_replace似乎我试图找到任何符合</p> <pre><code><element ... bentleysoft-widget="mywidget" ...></element> </code></pre> <p>,并用别的东西代替它影响只有一个匹配

我实际的字符串是:

$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

问题是.*贪婪。看看这个模式/foo.*bar/和下面的文字

foo hello bar world bar 

.*将匹配因为最后barhello bar world

要改变这种行为,你可以简单地添加一个?,这样的格局是这样的

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

,它应该工作


此外,由于要获取适当的收标记,您应该使用backreference这里

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

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

+0

非常感谢!有效!!! – user3470348

+0

@ user3470348不客气,也请看我的更新 – kero

+0

这很完美。我很抱歉我不能投票给你,我没有任何信誉,但真的很感谢你! – user3470348

相关问题