PHP编码限制来自多个标记的Preg_replace函数

PHP编码限制来自多个标记的Preg_replace函数,php,preg-replace,Php,Preg Replace,我有一个很棒的小脚本,可以搜索一个文件并用匹配的替换词替换一个单词列表。我还发现了一种方法,可以防止preg_replace替换那些出现在锚定标记、img标记或我指定的任何一个标记中的单词。我想创建一个OR语句,以便能够指定多个标记。为了清楚起见,我想防止preg_replace替换不仅出现在锚定标记中的单词,而且出现在锚定、链接、嵌入、对象、img或span标记中的任何单词。我尝试在代码中的不同位置使用“|”或运算符,但没有成功 <?php $data = 'somefile.h

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

    <?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"
“/(?!(?:[^ |[^>]+)\b(红色)\b/is”
我想知道如何在这个搜索中添加,,,这样preg_replace也不会替换这些标记中的“red”。

类似这样的东西?:

<?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>
之前:
红色
蓝白
红色
之后:
红色
波森贝里马铃薯
苹果

改用PHP DOM类遍历HTML文档。