【问题标题】:regular expression search and replace正则表达式搜索和替换
【发布时间】:2010-06-02 10:31:38
【问题描述】:

这是一些代码

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

但是

我要更换

<br /> fourth with <hr />

这个输出

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

请帮帮我

【问题讨论】:

  • 您的问题难以理解,请解释您要做什么。并展示你到目前为止所拥有的。
  • 我想替换一个在不同位置相似的主题短语
  • 正如 Amarghosh 下面所说,最好的办法是使用 HTML/DOM 解析器而不是正则表达式。

标签: php regex preg-match-all


【解决方案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

【讨论】:

  • 感谢回复,但我只想替换一个位置。
  • @Thoman: preg_replace 有一个 limit 参数;只需将其设置为1 (ideone.com/HKpjj)
【解决方案2】:

这仅适用于给定的情况:

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

如果您正在寻找通用解决方案,请RegEx is not the best tool。使用 HTML/XML 解析器。

【讨论】:

    【解决方案3】:

    对于这种特定情况:

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

    【讨论】:

      【解决方案4】:

      不需要使用正则表达式。

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

      【讨论】: