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