2010-10-30 67 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