在XPath评估之前如何处理string中的双引号?

在下面的函数中,当$ keyword中的string包含双引号时,它会创build一个“Warning:DOMXPath :: evaluate():Invalid expression”

$keyword = 'This is "causing" an error'; $xPath->evaluate('boolean(//img[contains(@alt, "'.$keyword.'")])'); 

对于xpathexpression式,我应该怎么做prep $keyword

全function代码:

 $keyword = trim(strtolower(rseo_getKeyword($post))); function sx_function($heading, $post){ $content = $post->post_content; if($content=="" || !class_exists('DOMDocument')) return false; $keyword = trim(strtolower(rseo_getKeyword($post))); @$dom = new DOMDocument; @$dom->loadHTML(strtolower($post->post_content)); $xPath = new DOMXPath(@$dom); switch ($heading) { case "img-alt": return $xPath->evaluate('boolean(//img[contains(@alt, "'.$keyword.'")])'); default: return $xPath->evaluate('boolean(/html/body//'.$heading.'[contains(.,"'.$keyword.'")])'); } } 

PHP有Xpath 1.0,如果你有一个带双引号和单引号的string,一个解决方法是使用Xpath concat()函数。 辅助函数可以决定何时使用什么。 实施例/用途:

 xpath_string('I lowe "double" quotes.'); // xpath: 'I lowe "double" quotes.' xpath_string('It\'s my life.'); // xpath: "It's my life." xpath_string('Say: "Hello\'sen".'); // xpath: concat('Say: "Hello', "'", "'sen".') 

帮手function:

 /** * xpath string handling xpath 1.0 "quoting" * * @param string $input * @return string */ function xpath_string($input) { if (false === strpos($input, "'")) { return "'$input'"; } if (false === strpos($input, '"')) { return "\"$input\""; } return "concat('" . strtr($input, array("'" => '\', "\'", \'')) . "')"; } 

为了避免XPath 2.0string文字中的string分隔符,您需要将每个分隔符replace为2,所以"需要replace为""

 [74] StringLiteral ::= ('"' (EscapeQuot | [^"])* '"') | ("'" (EscapeApos | [^'])* "'") /* ws: explicit */ [75] EscapeQuot ::= '""' [76] EscapeApos ::= "''" 

我不确定是否已经有一个函数可以使用,但是可以使用这个函数:

 function xpath_quote($str, $quotation='"') { if ($quotation != '"' && $quotation != "'") return false; return str_replace($quotation, $quotation.$quotation, $str); } 

用法:

 'boolean(/html/body//'.$heading.'[contains(.,"'.xpath_quote($keyword).'")])'