2011-01-11 67 views
0

我创建了一个函数来搜索字符串并用链接替换那些字符串中的关键字。我正在使用php preg_replace需要帮助

preg_replace('/\b(?<!=")(?<!=\')(?<!=)(?<!=&quot;)(?<!>)(?<!&gt;)' . $keyword . '(?!</a)(?!&lt;/a)\b', $newString, $row); 

它按预期工作。唯一的问题是,如果有人有一个链接这样

<a href="www.domain.tdl/keyword.html">Luxury Automobile sales</a> 

Automobile是我们在这个例子中$keyword

它最终会看起来像

<a href="www.domain.tdl/keyword.html">Luxury <a href="www.domain.tdl/keywords.html">Automobile</a> Sales</a> 

你能理解我的无奈。 对正则表达式没有信心我想我会问这里有人会知道一个解决方案。

谢谢!

+0

不要使用HTML ... – knittl 2011-01-11 11:40:20

回答

3

如何正确的HTML解析器像DOMDocument?

$html = '<a href="www.domain.tdl/keyword.html">Luxury Automobile sales</a>'; 
$dom = new DomDocument; 
$dom->loadHTML($html); 
$nodes = $dom->getElementsByTagName('a'); 
foreach ($nodes as $node) 
{ 
    $node->nodeValue = str_replace('Automobile', 'Cars', $node->nodeValue); 
    echo simplexml_import_dom($node)->asXML(); 
} 

是不是得到元素属性的问题太

foreach ($nodes as $node) 
{ 
    $attr = $node->getAttributeNode('href'); 
    $attr->value = str_replace('Automobile', 'keyword', $attr->value); 
    echo simplexml_import_dom($node)->asXML(); 
} 
+0

正则表达式通过观察,我收集它会查看每个链接并替换其中的某些文本。这不是我想要实现的。我试图用链接包装关键字的任何实例。问题是,如果关键字是用其他词语包装的,而且这些词语是用链接包装的(就像原始示例一样),它仍然会用链接包装关键字,因此我最终会得到一个双链接。 – Jack 2011-01-11 11:06:42