PHP将单词替换为除图像之外的链接

时间:2013-04-01 22:37:43

标签: php preg-replace str-replace

我的代码是

$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个字时才会替换。

3 个答案:

答案 0 :(得分:1)

编辑:预先建议的更正不相关。

还是:

答案 1 :(得分:1)

编辑:我无法相信我花了很长时间才明白你正试图用正则表达式解析大块HTML。 阅读这个问题的答案: RegEx match open tags except XHTML self-contained tags

答案 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更复杂,那么在文档中进行更彻底的遍历应该非常容易。我希望这会对你有所帮助。