2016-11-04 3 views
-1

에있는 DOMDocument에 META 리디렉션 찾을 나는 다음과 같은 HTML이 있습니다DOMXPath

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

내가 리디렉션와 META를 찾으려면, 그래서 다음 XPath 쿼리 작성 : 그러나

/html/head/meta[@http-equiv="refresh"] 

을, 'http-equiv'의 '-'가 오류의 원인입니다.

Invalid regular expression: //html/head/meta[@http-equiv="refresh"]/: Range out of order in character class

어떻게하면 XPath 쿼리를 제대로 다시 작성할 수 있습니까? 메타 리디렉션을 찾으십니까?

HTML 코드에서 '-'를 제거하면 쿼리가 예상대로 작동하지만 불행히도 'http-equiv'는 표준으로 설정되어 있으므로 변경할 수 없습니다. 이 실험을 통해 나는 매우 가까이에 있음을 알 수있었습니다 ...

+0

이 XPath 쿼리를 수행하는 PHP 코드는 무엇입니까? – Flynn1179

+0

$ dom = 새 DOMDocument(); $ dom-> loadHTML ($ content); $ xpath = 새로운 DOMXPath ($ dom); $ redir = $ xpath-> query ('// 메타 [@ http-equiv = "refresh"]/@ content'); – patrick

답변

0

However, the '-' in 'http-equiv' is causing an error:

Invalid regular expression: //html/head/meta[@http-equiv="refresh"]/: Range out of order in character class

분명히, 사용중인 XPath 엔진은 버그입니다.

질문에 사용 된 XPath 표현식은 유효한 XPath 1.0 표현식이며 원하는 <meta> 요소을 선택합니다.

<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> 

XPath 식을 평가하고 선택 대조 - 여기

는 XSLT이고 이 평가 노드는 출력됩니다. :

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

PHP7의 XPath 엔진을 사용하고 있습니다. – patrick

+0

@ 패트릭, 결론을 내리십시오 ... "XPath 엔진"은 XPath 구현을 준수하지 않습니다. 어쩌면 PHP에서 지원되는 XPath 표현식을 평가할 수있는 다른 방법이 있습니다. –

+0

사실, 그 사실을 입증 해 주셔서 감사합니다. 하지만 ... PHP7은 내가해야 할 일입니다. 이것에 관한 어떤 방법을 알고 있습니까? – patrick