仅替换标签括号内

时间:2014-08-05 17:55:58

标签: php regex

我希望正则表达式在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>

2 个答案:

答案 0 :(得分:1)

正则表达式:

<[^>]*\KREPLACE_ME(?=[^>]*?>)

替换字符串:

REPLACED

DEMO

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解析器。正如这样的标签,正则表达式非常有限。