好的,这是一个用以下特殊字符扩展 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;
}
?>