用2个正则表达式替换一个

时间:2012-10-03 15:05:51

标签: php regex

我有一个字符串......

$str = 'bob<br /><br />looked so good<br />tonight!';

我想替换只有一个<br />和两个的实例。

此刻我......

echo preg_replace('/(<br \/>\s*){1}/', '<br /><br />', $str);

但是,这只是两个<br />之后的事情,它应该只追求好。

任何帮助都会很棒!

修改:输出应为...

bob<br /><br />looked so good<br /><br />tonight!

3 个答案:

答案 0 :(得分:4)

基本上,您需要一个<br />标记,该标记不在其他标记之前或之后。因此:

/(?<!<br \/>)<br \/>(?!<br \/>)/

这假定所有<br />代码都是<br />而不是<br><br/>,甚至是<br style="clear:both;">。为了更好地解析,您应该使用DOM解析器并查找BR个节点,这些节点不会先于另一个BR节点,也不会紧跟其后。

答案 1 :(得分:1)

这会将<br />的任何数字(大于零)替换为两个:

print preg_replace('|(?:<br />)+|', '<br /><br />', $str);

示例:

$str = 'bob<br /><br />looked so good<br />tonight!<br /><br /><br />Bye!';
print preg_replace('|(?:<br />)+|', '<br /><br />', $str);
# output: "bob<br /><br />looked so good<br /><br />tonight!<br /><br />Bye!"

答案 2 :(得分:0)

您指定要匹配一个并将其替换为两个。

这不是你想要的 - 你只想添加一个额外的,如果那个没有跟随第二个相同的东西?

尝试

echo preg_replace('/(<br \/>\s*){1}([^<])/', '<br /><br />$1', $str);

这样可以确保您在匹配之前没有任何其他标签,更换前。

请注意,在

的情况下,这不会取代
<b>bob<br /></b> 

尽管如此,您可能希望更具体地了解结束边界 条件,只要你确保将它添加回到最后,就可以使结束边界变得复杂。