2010-10-30 54 views
5

下面的兩種方法都起到相同的作用:掃描帖子的內容並確定是否至少有一個img標籤的alt屬性包含正在測試的「關鍵字」。使用xPath或Regex?

我是新來的XPath,寧願它取決於做法是多麼昂貴相比,正則表達式的版本使用...

方法#1使用的preg_match

function image_alt_text_has_keyword($post) 
     { 
      $theKeyword = trim(wpe_getKeyword($post)); 
      $theContent = $post->post_content; 
      $myArrayVar = array(); 
      preg_match_all('/<img\s[^>]*alt=\"([^\"]*)\"[^>]*>/siU',$theContent,$myArrayVar); 
      foreach ($myArrayVar[1] as $theValue) 
      { 
       if (keyword_in_content($theKeyword,$theValue)) return true; 
      } 
      return false; 
     } 

function keyword_in_content($theKeyword, $theContent) 
     { 
      return preg_match('/\b' . $theKeyword . '\b/i', $theContent); 
     } 

方法#2使用xPath

function keyword_in_img_alt() 
{ 
global $post; 
$keyword = trim(strtolower(wpe_getKeyword($post))); 
$dom = new DOMDocument; 
$dom->loadHTML(strtolower($post->post_content)); 
$xPath = new DOMXPath($dom); 
return $xPath->evaluate('count(//a[.//img[contains(@alt, "'.$keyword.'")]])'); 
} 
+0

「constains」?我認爲你有一個錯字。 – 2010-10-30 17:30:50

+0

謝謝,修復了錯字並編輯了xPath – 2010-10-30 17:52:47

回答

14

如果您正在解析XML,則應該使用XPath,因爲它正是爲此目的而設計的。 XML/XHTML不是常規語言,不能通過正則表達式正確解析。你可以寫一個正則表達式,這個正則表達式適用於某些時間,但是會有特殊的情況發生。

+3

「XPath用於瀏覽XML文檔中的元素和屬性。」從馬嘴(W3C)。 – 2010-10-30 17:31:10

+2

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2010-10-30 17:31:55

+0

+1在XML上使用正則表達式就像使用螺絲刀來削減樹。在XML上使用XPath就像使用電鋸切斷樹一樣。兩者都很有用,但都不能取代另一個。 – delnan 2010-10-30 17:33:18

4

使用RegEx選擇XML文檔中的節點與使用RegEx來查找給定數字是否爲素數相當。

this is possible並沒有使它變得更合適

更重要的是,XPath 2.0 has RegEx support而RegEx沒有XPath支持。因此,如果兩者都需要,最好使用XPath 2.0

+0

*(旁註)* OP的示例代碼提供了一個PHP環境。 PHP的DOM擴展使用libxml。 libxml不支持XPath 2.0。但PHP的DOM擴展支持在XPath中使用任何PHP函數,包括正則表達式。所以儘管從語言不可知的POV你的答案是完全正確的,但它必須閱讀PHP的DOMXPath實現具有RegEx支持。這仍然導致當然相同的結論:) – Gordon 2010-11-05 23:14:12

+0

@戈登,他可以使用XSLT 1.0 – 2010-11-05 23:15:42