好的,这里有一个函数使用以下特殊字符扩展了 XPath 语法
~ 如果定义了默认命名空间前缀,则插入默认命名空间前缀
# text() 的简写
% comment() 的简写
$ node() 的简写
?* processing-instruction() 的简写
?foo processing-instruction("foo") 的简写
? processing-instruction("") 的简写
^ 转义后面的字符(使用文字或 SGML 实体,根据需要)
除了 ^ 之外,所有这些在引号字符串中都会被忽略
<?php
function extendXPath($str, $defns = NULL) {
$quote = false;
$map = array(
'~' => isset($defns) ? "$defns:" : '',
'#' => 'text()',
'%' => 'comment()',
'$' => 'node()'
);
$out = '';
for ($i = 0, $len = strlen($str); $i < $len; $i++) {
$c = $str[$i];
if (!$quote && array_key_exists($c, $map)) {
$out .= $map[$c];
} else switch ($c) {
case '^':
$out .= htmlspecialchars($str[++$i], ENT_QUOTES);
break;
case '?':
if ($quote) {
$out .= $c;
} elseif ($str[$i + 1] == '*') {
$out .= 'processing-instruction()';
$i++;
} else {
preg_match('/^\w+/', substr($str, $i + 1), $matches);
$out .= 'processing-instruction("'.$matches[0].'")';
$i += strlen($matches[0]);
};
break;
case '"':
$quote = !$quote;
default:
$out .= $c;
};
};
return $out;
}
?>