PHP编码从多个标签中限制Preg_replace函数

时间:2011-01-11 19:28:21

标签: php preg-replace

我有一个很棒的小脚本,可以搜索文件并用匹配的替换词替换单词列表。我还找到了一种方法来阻止preg_replace替换那些单词,如果它们出现在锚标签,img标签或我指定的任何一个标签中。我想创建一个OR语句,以便能够指定多个标签。为了清楚起见,我想阻止preg_replace替换不仅出现在锚标记中的单词,而是替换出现在锚点,链接,嵌入,对象,img或span标记中的单词。我试过用'|'代码中不同位置的OR运算符没有成功。

    <?php
$data = 'somefile.html';
$data = file_get_contents($data);
$search = array ("/(?!(?:[^<]+>|[^>]+<\/a>))\b(red)\b/is","/(?!(?:[^<]+>|[^>]+<\/a>))\b(white)\b/is","/(?!(?:[^<]+>|[^>]+<\/a>))\b(blue)\b/is");
$replace = array ('Apple','Potato','Boysenberry');
echo preg_replace($search, $replace, $data);?>
print $data;
?>

查看第一个搜索词,主要是搜索“红色”而不是内部:

"/(?!(?:[^<]+>|[^>]+<\/a>))\b(red)\b/is"

我想知道如何以某种方式添加&lt; \ / link&gt;,&lt; \ / embed&gt;,&lt; \ / object&gt;,&lt; \ / img&gt;对于此搜索,以便preg_replace不会替换任何这些标记中的“red”。

1 个答案:

答案 0 :(得分:0)

这样的东西?:

<?php
   $file = 'somefile.html';
   $data = file_get_contents($file);
   print "Before:\n$data\n";
   $from_to = array("red"=>"Apple",
                    "white"=>"Potato",
                    "blue"=>"Boysenberry");
   $tags_to_avoid = array("a", "span", "object", "img", "embed");
   $patterns = array();
   $replacements = array();

   foreach ($from_to as $from=>$to) {
     $patterns[] = "/(?!(?:[^<]*>|[^>]+<\/(".implode("|",$tags_to_avoid).")>))\b".preg_quote($f
rom)."\b/is";
     $replacements[] = $to;
   }

   $data = preg_replace($patterns, $replacements, $data);

   print "After:\n$data\n";
   ?>

结果:

Before:
<a href="red.html">red</a>
<span class="blue">red</span>
blue<div class="blue">white</div>
<div class="blue">red</div>

After:
<a href="red.html">red</a>
<span class="blue">red</span>
Boysenberry<div class="blue">Potato</div>
<div class="blue">Apple</div>