2011-01-11 128 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