preg_replace函数:如何搜索字符串而不考虑其中的一个部分?

时间:2012-03-09 05:32:03

标签: php regex preg-replace

$string='Stack overflow in <font color="yellow"> "yellow"</font> font';
$words='"yellow"'
$string=preg_replace('/'.$words.'/i', 
                     "<font style=\"background-color:blue;\">$0</font>",
                     $string);

字符串“yellow”是来自不同函数的参数。 preg_replace也在字体标记内找到“黄色”。使用preg-replace时如何避免使用字体标记?

编辑 - 所需的输出(为了便于阅读而引入的换行符)

Stack overflow in <font backgroundcolor="yellow">
<font style="background-color:yellow">"yellow"</font></font> font

2 个答案:

答案 0 :(得分:0)

我认为你正在寻找的是(作为一个单行,我认为这实际上有助于在这种情况下的可读性):

$string = preg_replace('/backgroundcolor="yellow"/i',
 'style="background-color:yellow;"',
 'Stack overflow in <font backgroundcolor="yellow"> "yellow"</font> font');
echo $string;

...这给出了输出“Stack overflow in”yellow“font”

相反,如果您想要替换“黄色”的其他实例,那么这就是您想要的:

$string = preg_replace('/"yellow"</i',
 'style="background-color:yellow;"<',
 'Stack overflow in <font backgroundcolor="yellow"> "yellow"</font> font');
echo $string;

...这给出了输出“Stack over background in background-color:yellow;”字体“

基本上,您可以通过添加足够的额外细节来识别您想要更改的那个,以便只匹配一个而不是另一个。

对于像@ mathematical.coffee这样的更通用的解决方案,这样的东西可能会更好(编辑以反映指定的输出):

$string = preg_replace('/>(.*)("yellow")(.*)</i',
 '$0<font style="background-color:yellow;">$1</font>$2',
 'Stack overflow in <font backgroundcolor="yellow"> "yellow"</font> font');
echo $string;

答案 1 :(得分:0)

您可以尝试以下方式:

preg_replace('@$words(?![^<>]*>)@i',
             '<font style="background-color:yellow;">$0</font>',
             $string);

(?![^<>]*>)否定前瞻

它说,“匹配$words,但,如果它紧跟着:

  • a >:表示“黄色”在 HTML标记内[^<>]*表示保留在当前标记内。

这假定您的HTML格式正确 - 您的文字中没有<> 标记的一部分(即,假设全部流浪<>已经变为&lt;&gt;

(根据所需的输出更新)。