2012-10-23 2 views
0

HTML DOM 내에서 값을 찾는 다음 함수가 있습니다.DOM XPath Query에서 잘못된 문자를 모두 이스케이프하려면 어떻게해야합니까?

그것은 작동하지만, 내가 좋아하는 매개 변수 $value 줄 때 그것을 '문자

어떻게 DOM의 XPath 쿼리에서 모든 잘못된 문자를 탈출

을 탈출하고 있지 않기 때문에, Levi's Baby Overall, 그 균열을?

private function extract($file,$url,$value) { 
    $result = array(); 
    $i = 0; 
    $dom = new DOMDocument(); 
    @$dom->loadHTMLFile($file); 
    //use DOMXpath to navigate the html with the DOM 
    $dom_xpath = new DOMXpath($dom); 
    $elements = $dom_xpath->query("//*[text()[contains(., '" . $value . "')]]"); 
    if (!is_null($elements)) { 
     foreach ($elements as $element) { 
      $nodes = $element->childNodes; 
      foreach ($nodes as $node) { 
       if (($node->nodeValue != null) && ($node->nodeValue === $value)) { 
        $xpath = preg_replace("/\/text\(\)/", "", $node->getNodePath()); 
        $result[$i]['url'] = $url; 
        $result[$i]['value'] = $node->nodeValue; 
        $result[$i]['xpath'] = $xpath; 
        $i++; 
       } 
      } 
     } 
    } 
    return $result; 
} 
+0

당신은 아마 여기에 답변을 찾을거야 : http://stackoverflow.com/questions/4452323/xpath-query-with-single-quote. – matthias

+0

나는 가능하다고 생각하지 않는다, 그는 코드가 모든 DOM의 –

답변

1

(악의적 인) XPath 삽입의 위험 때문에 임의의 사용자 제공 문자열로 XPath 표현식의 자리 표시자를 대체해서는 안됩니다.

이러한 알려지지 않은 문자열을 안전하게 처리하려면 미리 컴파일 된 XPath 식을 사용하고 사용자가 제공 한 문자열을 변수로 전달해야합니다. 또한 코드에서 중첩 된 따옴표를 처리 할 필요가 완전히 없어진다.

+0

에서 작동하지 않는다. 처음에 문자열을 ESCAPING하는 전체 이유는 해커가 삽입 할 수 없도록 xpath에서 특별한 의미가 없음을 확인하는 것이다. '// parent :: * [@ password]' – hanshenrik

+0

'와 같은 정확한 텍스트 문자열을 정확하게 검색 할 수있는 솔루션은 미리 컴파일 된 XPath 표현식을 사용하고 사용자가 제공 한 문자열을 (PHP를 피할 또 다른 이유가 있습니다.) – hanshenrik

+0

@hanshenrik, 예, PHP는 잘 모르겠습니다. PHP에서 DOMXPath가 변수를 지원하지 않기 때문에 PHP에서 해결책이 아닙니다. .NET 사용자는 XsltContext 클래스를 사용할 수 있습니다. https://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltcontext(v=vs.110).aspx –

0

PHP에는 XPath 쿼리의 이스케이프/인용 문자열을위한 내장 함수가 없습니다. 여기에 자신의 C#의 XPath는 견적 기능의 PHP 포트입니다 https://stackoverflow.com/a/1352556/1067003 및 :

function xpath_quote(string $value):string{ 
    if(false===strpos($value,'"')){ 
     return '"'.$value.'"'; 
    } 
    if(false===strpos($value,'\'')){ 
     return '\''.$value.'\''; 
    } 
    // if the value contains both single and double quotes, construct an 
    // expression that concatenates all non-double-quote substrings with 
    // the quotes, e.g.: 
    // 
    // concat("'foo'", '"', "bar") 
    $sb='concat('; 
    $substrings=explode('"',$value); 
    for($i=0;$i<count($substrings);++$i){ 
     $needComma=($i>0); 
     if($substrings[$i]!==''){ 
      if($i>0){ 
       $sb.=', '; 
      } 
      $sb.='"'.$substrings[$i].'"'; 
      $needComma=true; 
     } 
     if($i < (count($substrings) -1)){ 
      if($needComma){ 
       $sb.=', '; 
      } 
      $sb.="'\"'"; 
     } 
    } 
    $sb.=')'; 
    return $sb; 
} 

사용 예 :

$elements = $dom_xpath->query("//*[contains(text()," . xpath_quote($value) . ")]"); 
    또한, XPath를위한 문자열을 탈출을 수행합니다 의외로 어려운, 여기에 이유에 대한 자세한 정보입니다 (필요한 경우 또는 CONCAT() 동급) xpath_quote 기능이 나를 위해 그것을 않기 때문에 내가,는 XPath 자체에 인용 문자 ( ")을 추가하지 않은 방법
  • 통지
관련 문제