PHP DOMXPath->;查询()/->;evaluate()与内部文本不匹配
我目前正在尝试创建一个纯PHP菜单遍历系统——这是因为我为一些人做了一个即兴项目,但他们需要尽可能少的JS(即:无),最好是纯PHP 我的菜单如下所示: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
ul{
列表样式类型:无;
}
导航>ul.sidebar-list ul.sub{
显示:无;
}
导航>ul.sidebar-list ul.sub.active{
显示:块;
}
PHP使用XPath 1.0matches
是一个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命名空间声明的情况下工作,这甚至更好!这里没有涉及名称空间,所以我不明白你为什么需要它们,但很高兴你让它工作了。