只替换标签括号内的内容


Replace only inside tag brackets

我想在preg_replace()中使用正则表达式来替换a中的文本标记(在"<"answers">"之间),而不影响文本超出尖括号的限制。就像这个例子:

$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>

Regex:

<[^>]*'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>

解释:

  • <匹配小于<的符号。
  • [^>]* 0次或0次以上匹配非>字符
  • 'K丢弃先前匹配的字符。因此,从<REPLACE_ME字符串将被丢弃。
  • REPLACE_ME匹配字符串REPLACE_ME
  • (?=[^>]*?>) Lookahead断言以下字符必须不是>符号后面跟着>的字符。这确保了匹配的字符串REPLACE_ME<>块内。

可能是这样的

我认为你想要的是积极的向前看或向后看。

所以我使用的正则表达式是:
(?<=<).*?(REPLACE_ME).*?(?=>)

(?<=<)意味着确保左边有一个<
那么(?=>)意味着确保右边有一个>

另外,考虑使用XML解析器。当涉及到这样的标签时,Regex是非常有限的。