1

我的代码是

$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);

我想用 Guys 替换 Hello,除了 img src 和 alt。

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 个单词时才替换。

4

3 回答 3

1

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

仍然:

于 2013-04-01T22:42:38.593 回答
1

编辑:我不敢相信我花了这么长时间才明白您正在尝试使用正则表达式解析大块 HTML。阅读这个问题的答案: RegEx match open tags except XHTML self-contained tags

于 2013-04-01T22:46:50.690 回答
0

编辑:我更新了代码以更好地工作。

我不确定到底是什么问题,但是查看您的代码,我不会感到惊讶的是,正则表达式背后的负面外观与多个单词字符串不匹配,其中“关键字”不是 src 或 alt 之后的第一个单词。增强正则表达式可能是可能的,但恕我直言,复杂的正则表达式对于您的 html 解析需求来说可能有点太脆弱了。我建议自己做一些基本的 html 解析并在正确的地方做一个简单的字符串替换。

这是一些基本代码。肯定有比这更好的解决方案,但我不会在这上面花太多时间。可能,您应该创建一个a具有正确属性的新 html 元素,而不是在文本节点中插入 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 的根的子级。如果$text更复杂,应该很容易更彻底地遍历文档。我希望这可以帮助你。

于 2013-04-02T00:13:49.253 回答