PHP DOMXPath->;查询()/->;evaluate()与内部文本不匹配

PHP DOMXPath->;查询()/->;evaluate()与内部文本不匹配,php,html,xpath,domdocument,Php,Html,Xpath,Domdocument,我目前正在尝试创建一个纯PHP菜单遍历系统——这是因为我为一些人做了一个即兴项目,但他们需要尽可能少的JS(即:无),最好是纯PHP 我的菜单如下所示: ul{ 列表样式类型:无; } 导航>ul.sidebar-list ul.sub{ 显示:无; } 导航>ul.sidebar-list ul.sub.active{ 显示:块; } PHP使用XPath 1.0matches是一个XPath 2.0函数,因此如果您正在查找警告,您可能会在错误日志中看到警告 PHP W

我目前正在尝试创建一个纯PHP菜单遍历系统——这是因为我为一些人做了一个即兴项目,但他们需要尽可能少的JS(即:无),最好是纯PHP

我的菜单如下所示:

ul{
列表样式类型:无;
}
导航>ul.sidebar-list ul.sub{
显示:无;
}
导航>ul.sidebar-list ul.sub.active{
显示:块;
}


PHP使用XPath 1.0
matches
是一个XPath 2.0函数,因此如果您正在查找警告,您可能会在错误日志中看到警告

PHP Warning:  DOMXPath::query(): xmlXPathCompOpEval: function matches not found in php shell code on line 1
PHP Stack trace:
PHP   1. {main}() php shell code:0
PHP   2. DOMXPath->query() php shell code:1
一个简单的区分大小写的匹配可以通过相等性检查来完成

$title_text = "Farming";
$menu_query = "//a/li[. = '$title_text']";
但不区分大小写的搜索需要将字符从大写转换为小写:

$title_text = "FaRmInG";
$title_text = strtolower($title_text);
$menu_query = "//a/li[translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '$title_text']";
在任何一种情况下,我们都会得到一个节点列表,该列表可以迭代:

$html = <<< HTML
<nav class="sidebar" aria-labelledby="primary-navigation">
  <ul class="sidebar-list">

    <!--each element has a sub-menu which is initially hidden by css when the page is loaded. Via php the appropriate path the current page and top-level links will be visible only-->
    <a href="#"><li>Home</li></a>
    <!--sub-items-->
    <ul class="sub active">
      <a href="#"><li>Barn</li></a>
      <a href="#"><li>Activities</li></a>
      <ul class="sub active">
        <a href="#"><li>News</li></a>
        <a href="#"><li>Movements</li></a>
        <a href="#"><li>Reviews</li></a>
        <a href="#"><li>About Us</li></a>
        <a href="#"><li>Terms of Use</li></a>
      </ul>
    </ul>
    <a href="#"><li>Events</li></a>
    <ul class="sub">
      <a href="#"><li>Overview</li></a>
      <a href="#"><li>Farming</li></a>
      <a href="#"><li>Practises</li></a>
      <a href="#"><li>Links</li></a>
      <ul class="sub">
        <a href="#"><li>Another Farm</li></a>
        <a href="#"><li>24m</li></a>
      </ul>
    </ul>
  </ul>
</nav>
HTML;
$menu = new DOMDocument();
$menu->loadHTML($html);
$xpath = new DOMXPath($menu);
$elements = $xpath->query($menu_query);
foreach ($elements as $element) {
    print_r($element);
}
$html=
    query($menu\u query); foreach($elements作为$element){ 打印(元素); }
fn:lower-case()
是一个XPath 2.0+函数。@Alejandro我怎么知道运行的是哪个版本的XPath?另外,如果它不受支持,那么肯定会返回false,对吗?如果没有为您的执行上下文定义该函数,XPath引擎应该报告一个错误。在XPath执行上下文中,无法知道支持的语言版本。如果XPath 2.0函数失败,那么您有一个XPath 1.0引擎。它说如果查询无效,它将返回false,但是如果我使用不受支持的函数,您是说php实际上会抛出错误吗?因为我尝试了lower-case(),它没有抛出错误,只是返回了0 matchesthankyou,检查错误日志会很有用,所以我让libxml_超过了_错误,因为它正在写入文档,它现在确实成功匹配了,而且目前它在没有xpath命名空间声明的情况下工作,这甚至更好!这里没有涉及名称空间,所以我不明白你为什么需要它们,但很高兴你让它工作了。