2011-05-12 134 views
3

我有一個函數可以通過掃描博客條目,新聞和某些核心關鍵字的其他項目來幫助鏈接我網站中的頁面。然後它將這些關鍵字替換爲相應頁面的鏈接。正則表達式替換不在HTML標籤內的內容

我遇到了一些問題,有些詞不應該被鏈接替換。例如,我在我的一些HTML表格中有一個摘要標記,其中包含表格內容的小概要。因此,例如,我可能有一個標籤,看起來像這樣:

<table width="500" cellspacing="0" cellpadding="4" border="0" summary="This table contains a list of all car parts in inventory along with their corresponding prices"> 
... 
</table> 

我的功能錯誤地將替換關鍵字或短語,如「汽車零部件」的鏈接。我如何構建我的替換正則表達式而不是在像這樣的情況下替換它,但是如果它出現在段落中,或者甚至在HTML表格的單元格中出現,請替換它。

在此先感謝您的幫助和指導!

編輯:只是爲了澄清,我使用PHP來呈現我的網頁。在內容以HTML格式輸出到頁面之前,我正在使用str_replace()。我希望能夠用ereg_replace()替換它,以便只有在滿足特定條件(如上所述)時才替換內容。對不起,如果這造成混亂!

+1

什麼是您當前的正則表達式模式? – 2011-05-12 13:48:27

+1

似乎人們普遍認爲,你不應該使用正則表達式與可複雜的HTML規則結合使用。您是否考慮過使用XML解析器來確定要運行替換的部分? – 2011-05-12 13:49:59

+0

對不起,我應該澄清,我會添加一條EDIT語句。我使用PHP來呈現頁面輸出。我會在PHp ereg_replace()中使用正則表達式,而不是使用str_replace()。 – Dexter 2011-05-12 14:08:27

回答

6

Don't use regexes to parse HTML。使用PHP DOM:

$DOM = new DOMDocument; 
$DOM->loadHTML($str); // Your HTML 

//get all tds 
$cells = $DOM->getElementsByTagName('td'); 

// Do stuff to the cells 

//get all paragraphs 
$paragraphs = $DOM->getElementsByTagName('p'); 

// Do stuff to the paragraphs 

// Etc... 
+0

如何處理奇怪的情況?例如,我想用鏈接替換汽車,但汽車是另一個句子的一部分,整個句子包含一個鏈接。我不想在這種特殊情況下將其鏈接起來,我怎樣才能抓住它,所以它很聰明,可以忽略這種情況? – Dexter 2011-05-16 13:31:26

+0

這裏是一個解決方案: '而($ parentNode = $節點 - > parentNode){ /*檢查$ parentNode是錨和中止插入如果是*/ }' 或者,你可以創建一個XPath查詢以找到沒有錨點的單元/段落。有關更多信息,請參閱[PHP DOM DOM文檔](http://www.php.net/manual/en/class.domxpath.php)。 – 2011-05-16 16:35:26