我的代码是
$words = array();
$links = array();
$result = mysql_query("SELECT `keyword`, `link` FROM `articles` where `link`!='".$act."' ")
or die(mysql_error());
$i = 0;
while($row = mysql_fetch_array( $result ))
{
if (!empty($row['keyword']))
{
$words[$i] = '/(?<!(src="|alt="))'.$row['keyword'].'/i';
$links[$i] = '<a href="'.$row['link'].'.html" class="ared">'.$row['keyword'].'</a>';
$i++;
}
}
$text = preg_replace($words, $links, $text);
除了img src和alt。
之外,我想用Guys替换Hello这
Say Hello my dear <img src="say-hello-my-dear.jpg" alt="say hello my dear" />
我想要
Say Guys my dear <img src="say-hello-my-dear.jpg" alt="say hello my dear" />
当前代码仅在我的关键字只有1个字时才会替换。
答案 0 :(得分:1)
编辑:预先建议的更正不相关。
还是:
答案 1 :(得分:1)
答案 2 :(得分:0)
编辑:我更新了代码以更好地工作。
我不确定问题究竟是什么,但是查看你的代码我不会感到惊讶的是,正则表达式背后的负面看法不匹配多个单词字符串,其中“关键字”不是src之后的第一个单词或中高音。它可能会加强正则表达式,但恕我直言,复杂的正则表达式可能会对你的html解析需求有点太脆弱。我建议你自己做一些基本的html解析,并在正确的地方做一个简单的字符串替换。
这是一些基本代码。肯定有比这更好的解决方案,但我不会花太多时间在这上面。也许,您应该使用正确的属性创建一个新的html a
元素,而不是在文本节点中插入html。然后你不必解码它。但这将是我的基本方法。
$text = "Lorem ipsum <img src=\"lorem ipsum\" alt=\"dolor sit amet\" /> dolor sit amet";
$result = array(
array('keyword' => 'lorem', 'link' => 'http://www.google.com'),
array('keyword' => 'ipsum', 'link' => 'http://www.bing.com'),
array('keyword' => 'dolor sit', 'link' => 'http://www.yahoo.com'),
);
$doc = new DOMDocument();
$doc->loadHTML($text);
$xpath = new DOMXPath($doc);
foreach($result as $row) {
if (!empty($row['keyword'])) {
$search = $row['keyword'];
$replace = '<a href="'.$row['link'].'.html" class="ared">'.$row['keyword'].'</a>';
$text_nodes = $xpath->evaluate('//text()');
foreach($text_nodes as $text_node) {
$text_node->nodeValue = str_ireplace($search, $replace, $text_node->nodeValue);
}
}
}
echo html_entity_decode($doc->saveHTML());
$result
数据结构与mysql_fetch_array()
的结果相似。我只是为创建的html DOMDocument获取root的子节点。如果$text
更复杂,那么在文档中进行更彻底的遍历应该非常容易。我希望这会对你有所帮助。