2010-06-02 122 views
2

这是一些代码正则表达式搜索和替换

<br /> <br /> <br /> <br /> <br /> <br /> 

我想更换

<br /> fourth with <hr /> 

而这种输出

<br /> <br /> <br /> <hr /> <br /> <br /> 

请帮我

+0

你的问题是难以理解的,请解释一下你想要做什么。并显示你到目前为止。 – SilentGhost 2010-06-02 10:39:04

+0

我想在不同的位置替换相似的主题短语 – Thoman 2010-06-02 10:48:57

+0

正如Amarghosh在下面所说的,最好的办法是使用HTML/DOM解析器而不是正则表达式。 – richsage 2010-06-02 11:01:25

回答

1

也许这样的事情是你想要什么:

<?php 

$text = <<<EOT 

<br /> 1 <br /> 2 <br /> 3 <br /> 4 <br /> 5 <br /> 6 
<br /> 7 <br /> 8 <br /> 9 <br /> 10 <br /> 11 <br /> 12 
<br /> 13 <br /> 14 <br /> 15 <br /> 16 <br /> 17 <br /> 18 

EOT; 

$tag = '<br \\/>'; 
$content = '[^<]*'; 
print preg_replace("/($content(?:$tag$content){3})$tag/", '$1<BREAK! />', $text); 


?> 

输出(as seen on ideone.com):

<br /> 1 <br /> 2 <br /> 3 <BREAK! /> 4 <br /> 5 <br /> 6 
<br /> 7 <BREAK! /> 8 <br /> 9 <br /> 10 <br /> 11 <BREAK! /> 12 
<br /> 13 <br /> 14 <br /> 15 <BREAK! /> 16 <br /> 17 <br /> 18 

也就是说,这是一个痛苦,你真的不应该使用正则表达式。


如果你只想做一个替换,您可以将limit参数设置为preg_replace

preg_replace("/($content(?:$tag$content){3})$tag/", '$1<BREAK! />', $text, 1); 
                      ^^limit 
+0

感谢您的回复 但我想只替换一个位置。 – Thoman 2010-06-02 10:58:53

+0

@Thoman:'preg_replace'有一个'limit'参数;只需将其设置为“1”(http://ideone.com/HKpjj) – polygenelubricants 2010-06-02 11:03:19

+0

非常感谢您的帮助 – Thoman 2010-06-02 11:07:20

0

对于这个特定的情况下:

s/<br \/> 4/<hr \/> 4/ 
+0

你好,我编辑了我的代码 – Thoman 2010-06-02 10:43:49

1

这种方法仅对于给定的情况下:

preg_replace("#<br /> 4#", "<hr /> 4", $str); 

如果你正在寻找一个通用的解决方案,RegEx is not the best tool了点。使用HTML/XML解析器。

+0

你好,我已经编辑我的代码 – Thoman 2010-06-02 10:44:08

0

没有必要使用正则表达式。

echo str_replace(' <br /> 4', ' <hr /> 4', $str);