在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).'")])'