我希望正则表达式在preg_replace()中使用以仅替换a中的文本 标记(在"<"和">")之间,不影响尖括号限制的文本。 像这个例子:
$html = '<div class="REPLACE_ME" id="my_id">this REPLACE_ME cannot be replaced</div>';
$html = preg_replace('/\bREPLACE_ME\b/', 'REPLACED', $html);
然后,$ html变量中预期的结果必须如下:
<div class="REPLACED" id="my_id">this REPLACE_ME cannot be replaced</div>
正则表达式不能在引号周围,因为我有其他变体,如:
<REPLACE_ME>this REPLACE_ME cannot be replaced</REPLACE_ME>
<div REPLACE_ME="my_attribute">this REPLACE_ME cannot be replaced</div>
答案 0 :(得分:1)
正则表达式:
<[^>]*\KREPLACE_ME(?=[^>]*?>)
替换字符串:
REPLACED
PHP代码将是,
<?php
$mystring = <<<'EOT'
<div class="REPLACE_ME" id="my_id">this REPLACE_ME cannot be replaced</div>
<REPLACE_ME>this REPLACE_ME cannot be replaced</REPLACE_ME>
<div REPLACE_ME="my_attribute">this REPLACE_ME cannot be replaced</div>
EOT;
echo preg_replace('~<[^>]*\KREPLACE_ME(?=[^>]*?>)~', 'REPLACED', $mystring);
?>
<强>输出:强>
<div class="REPLACED" id="my_id">this REPLACE_ME cannot be replaced</div>
<REPLACED>this REPLACE_ME cannot be replaced</REPLACED>
<div REPLACED="my_attribute">this REPLACE_ME cannot be replaced</div>
<强>解释强>
<
匹配小于<
的符号。 [^>]*
匹配任何不属于>
零次或多次的字符。\K
丢弃之前匹配的字符。因此,从<
到REPLACE_ME
字符串将被丢弃。REPLACE_ME
匹配字符串REPLACE_ME
。(?=[^>]*?>)
Lookahead声称以下字符必须是>
符号后跟>
的任何字符。这可确保匹配的字符串REPLACE_ME
位于<>
块内。答案 1 :(得分:-2)
也许像this
我认为你所寻找的是一种积极的前瞻或后视。
所以我使用的正则表达式是:
(?<=<).*?(REPLACE_ME).*?(?=>)
(?<=<)
表示确保左侧有<
和
然后(?=>)
表示确保右侧有>
另外,请考虑使用XML解析器。正如这样的标签,正则表达式非常有限。