我有一个很棒的小脚本,可以搜索文件并用匹配的替换词替换单词列表。我还找到了一种方法来阻止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”。
答案 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>