2

我有一个字符串...

$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!
4

3 回答 3

4

基本上,您想要一个<br />既不在另一个标签之前也不在其后紧随其后的标签。因此:

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

这假设所有<br />标签都是字面意思<br />,而不是<br>, <br/>,甚至<br style="clear:both;">。为了更好地解析,您应该使用 DOM 解析器并查找BR没有紧跟在另一个节点之前或之后的BR节点。

于 2012-10-03T15:16:30.933 回答
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!"
于 2012-10-03T15:18:10.093 回答
0

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


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

尝试

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

这可确保
在替换之前,您要匹配的标签后面没有任何其他标签。

请注意,这不会在以下情况下取代

<b>bob<br /></b> 

尽管如此,您可能希望更具体地确定结束边界条件,只要确保将其添加回末尾,您就可以根据需要使结束边界变得复杂。

于 2012-10-03T15:16:53.757 回答