Php preg_replace函数:如何搜索字符串而不考虑其中的节? $string=“黄色”字体中的堆栈溢出; $words=“‘黄色’” $string=preg_replace('/'.$words.'/i', "$0", $string);

Php preg_replace函数:如何搜索字符串而不考虑其中的节? $string=“黄色”字体中的堆栈溢出; $words=“‘黄色’” $string=preg_replace('/'.$words.'/i', "$0", $string);,php,regex,preg-replace,Php,Regex,Preg Replace,字符串“yellow”是来自不同函数的参数。 preg_replace也会在字体标记内找到“黄色”。使用preg replace时如何避免字体标记 编辑-所需输出(仅为便于阅读而引入换行符) 中的堆栈溢出 “黄色”字体 我认为您需要的是(作为一行程序,因为我认为它实际上有助于本例的可读性): $string=preg_replace('/backgroundcolor=“yellow”/i', 'style=“背景色:黄色;”, '黄色字体中的堆栈溢出'); echo$字符串; 。。。这将给出

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

编辑-所需输出(仅为便于阅读而引入换行符)
中的堆栈溢出
“黄色”字体

我认为您需要的是(作为一行程序,因为我认为它实际上有助于本例的可读性):

$string=preg_replace('/backgroundcolor=“yellow”/i',
'style=“背景色:黄色;”,
'黄色字体中的堆栈溢出');
echo$字符串;
。。。这将给出输出“黄色字体的堆栈溢出”

相反,如果您的意思是要替换“yellow”的另一个实例,那么这就是您想要的:

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

$string=preg_replace('/“yellow”您可以尝试以下方法:

$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;
preg_replace('@$words(?![^]*>)@i',
'$0',
$string);
(?![^]*>)
是一个消极的前瞻

它说,“匹配
$words
,但如果后面紧跟着以下内容,则不匹配

  • a
    :表示“黄色”在HTML标记内。
    [^]*
    表示粘贴在当前标记内
这假设您的HTML格式良好-您的文本中没有不属于标记的
(即,假设所有零散的
已经转换为


(根据所需输出进行更新)。

我不明白-您想要输出什么?您想用
替换所有出现的
“黄色”
,是否可以显示您所需的输出…我想用“黄色”替换所有出现的“黄色”(双引号中的黄色)“带有背景色。但是我不希望preg_replace在html标记内搜索。我也不能从字符串中删除html标记。因此在上面的示例中,应该没有更改,因为出现了两个
”黄色”
都是
的一部分,我很抱歉。实际上,$words和$string是函数的参数,它可以是任何东西。我使用的示例不合适。preg\u replace不应该查看任何html标记参数,即。如何为其获取合适的regexp实际上不,
code
$string=preg_replace('/“yellow”/i','style=“background color:yellow;”,'Stack overflow in“yellow”font');
code
但我不想让preg_replace捕捉到标记内的第一个“黄色”;“inside”这个词有点让人困惑,因为inside可能意味着[这里在标记外],也可能意味着[在标记内部]。您似乎是指第一个。这就是为什么它有助于您给出所需结果的原因,它似乎是:style=“background color:yellow;”font.Correct?中的堆栈溢出,而不是“yellow”中的堆栈溢出字体,我的第一个答案可以解决这个问题吗?我想这对我们两人来说仍然很困惑,我希望在这种情况下的o/p是“黄色”中的堆栈溢出字体。虽然html o/p在许多情况下都是相同的,$words和$string作为函数的参数,它可以是任何东西。例如,我所用的不合适。无论作为参数输入的是什么,preg_replace都不应该查看任何html标记参数,即inside<和>。最后,如何为其获取合适的regexp!如果您指定了输出你一开始就想要(当你问问题时),您将避免许多不完全符合您要求的答案。我现在明白了,我是这方面的新手…感谢很多人,它正在工作,但是我认为OP希望排除任何HTML标记中的文本替换,而不仅仅是
。但每一个文本位最终都会包含在某种HTML标记中,即使它只是
。我需要更多的clar这是一种比我的方法更通用的方法,并且可以很容易地修改为非标记特定的方法。我的问题是,这个特定的任务比大多数任务更可能与具有大量匹配项的大型文档进行匹配,并且(据我所知)消极的前瞻性将给这个替换增加很多开销。
$string = preg_replace('/backgroundcolor="yellow"/i',
 'style="background-color:yellow;"',
 'Stack overflow in <font backgroundcolor="yellow"> "yellow"</font> font');
echo $string;
$string = preg_replace('/"yellow"</i',
 'style="background-color:yellow;"<',
 'Stack overflow in <font backgroundcolor="yellow"> "yellow"</font> font');
echo $string;
$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;
preg_replace('@$words(?![^<>]*>)@i',
             '<font style="background-color:yellow;">$0</font>',
             $string);