$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
答案 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
,但不,如果它紧跟着:
>
:表示“黄色”在 HTML标记内。 [^<>]*
表示保留在当前标记内。这假定您的HTML格式正确 - 您的文字中没有<
或>
不标记的一部分(即,假设全部流浪<
和>
已经变为<
和>
。
(根据所需的输出更新)。