使用DOMXPath在DOMDocument中查找重定向元

使用DOMXPath在DOMDocument中查找重定向元,dom,domdocument,domxpath,Dom,Domdocument,Domxpath,我有以下HTML: <html> <head> <meta http-equiv="refresh" content="0;URL=http://amazingjokes.com" /> </head> </html> 但是,“http equiv”中的“-”会导致错误: 无效的正则表达式://html/head/meta[@http equiv=“refresh”]/: 字符类中的范围无序 如何正确重

我有以下HTML:

<html>
    <head>
        <meta http-equiv="refresh" content="0;URL=http://amazingjokes.com" />
    </head>
</html>
但是,“http equiv”中的“-”会导致错误:

无效的正则表达式://html/head/meta[@http equiv=“refresh”]/: 字符类中的范围无序

如何正确重写xpath查询以找到元重定向

当我从HTML代码中删除“-”时,我尝试了这个方法,查询结果如预期的那样工作,但不幸的是“http equiv”是一个固定的标准,所以我不能改变它。这个实验表明我非常接近

但是,“http equiv”中的“-”会导致错误:

无效的正则表达式://html/head/meta[@http equiv=“refresh”]/: 字符类中的范围无序

显然,您使用的XPath引擎有缺陷

问题中使用的XPath表达式是有效的XPath 1.0表达式,它选择所需的
元素

下面是一个基于XSLT的验证:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 
  <xsl:template match="/">
    <xsl:copy-of select="/html/head/meta[@http-equiv='refresh']"/>
  </xsl:template>
</xsl:stylesheet>

对提供的XML文档应用上述转换时

<html>
    <head>
        <meta http-equiv="refresh" content="0;URL=http://amazingjokes.com" />
    </head>
</html>
<meta http-equiv="refresh" content="0;URL=http://amazingjokes.com"/>

对XPath表达式进行求值,并输出在此求值节点中选择的值

<html>
    <head>
        <meta http-equiv="refresh" content="0;URL=http://amazingjokes.com" />
    </head>
</html>
<meta http-equiv="refresh" content="0;URL=http://amazingjokes.com"/>


我正在使用中的XPath引擎PHP7@Patrick所以,得出结论。。。这个所谓的“XPath引擎”不是兼容的XPath实现。也许还有另一种方法可以计算PHP中支持的XPath表达式,您需要使用它。好的,谢谢您证明了这一点。但是PHP7是我必须使用的。你知道有什么办法吗?@Patrick,试试:
/html/head/meta[@*[name()=“http equiv”]=“refresh”]
。或者,您的“XPath引擎不支持属性……这也带来了同样的问题,但您确实向我指出了一个(非常难看的)解决方法:/html/head/meta[@*[name()=concat(“http”,“-equiv”)]=“refresh”]。显然,PHP7的XPath引擎(似乎问题出在正则表达式引擎中)试图使正则表达式超出任何字符范围(a-b或a-z),在本例中,“http equiv”被实现为“htt,然后是p-e,然后是quiv”或其他什么…它似乎有问题。这种解决方法很难看,但至少它是使用PHP7建立我的目标的一种方法。谢谢你。执行XPath查询的PHP代码是什么?$dom=new DOMDocument();$dom->loadHTML($content);$XPath=new DOMXPath($dom);$redir=$xpath->query('//meta[@http equiv=“refresh”]/@content');