【问题标题】:Use xPath or Regex?使用 xPath 还是正则表达式?
【发布时间】:2011-05-02 20:50:49
【问题描述】:

下面的两种方法都有相同的目的:扫描帖子的内容并确定是否至少有一个 img 标签具有包含正在测试的“关键字”的 alt 属性。

我是 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.'")]])');
}

【问题讨论】:

  • “包含”?我认为你有一个错字。
  • 谢谢,修正了错字并编辑了 xPath

标签: regex xpath


【解决方案1】:

如果您正在解析 XML,您应该使用 XPath,因为它正是为此目的而设计的。 XML/XHTML 不是正则语言,不能被正则表达式正确解析。您也许可以编写一个在某些时候有效的正则表达式,但在某些特殊情况下它会失败。

【讨论】:

  • "XPath 用于导航 XML 文档中的元素和属性。"来自马口 (W3C)。
  • +1 在 XML 上使用正则表达式就像用螺丝刀砍树一样。在 XML 上使用 XPath 就像使用电锯来砍树一样。两者都有用,但都不能替代另一个。
【解决方案2】:

使用 RegEx 选择 XML 文档中的节点与使用它来查找给定数字是否为素数一样合适。

this is possible 一点也不合适

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

【讨论】:

  • (sidenote) OP 的示例代码建议使用 PHP 环境。 PHP 的 DOM 扩展使用 libxml。 libxml 不支持 XPath 2.0。但是 PHP 的 DOM 扩展支持在 XPath 中使用任何 PHP 函数,包括正则表达式。因此,虽然您的答案从与语言无关的 POV 来看是完全正确的,但它必须阅读 PHP 的 DOMXPath 实现具有 RegEx 支持。当然,这仍然会得出相同的结论:)
猜你喜欢
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2022-01-11
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
相关资源
最近更新 更多