确定字符串是否是有效的XML标记名称的一般正则表达式(用PHP术语)是什么?
我首先使用/[^>]+/i
,但它也匹配4 \<<
,显然不是有效的标记名称。
所以我尝试将所有有效字符组合起来,例如/[a-z][a-z0-9_-]*/i
,这也是不对的,因为XML几乎允许任何外语标记名中的字符。
我现在仍然坚持 - 我应该检查是否有空白字符?或者还有更多吗?
答案 0 :(得分:9)
为什么不使用已经知道规则的XML解析器/生成器?
function isValidXmlElementName($elementName)
{
try {
new DOMElement($elementName);
} catch (DOMException $e) {
return false;
}
return true;
}
var_dump(isValidXmlElementName(' ')); // false
var_dump(isValidXmlElementName('1')); // false
var_dump(isValidXmlElementName('-')); // false
var_dump(isValidXmlElementName('a')); // true
答案 1 :(得分:4)
[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
[5] Name ::= NameStartChar (NameChar)*
答案 2 :(得分:1)
从相同的规范,但然后更清楚:
“鼓励文档作者使用自然语言中有意义的单词或单词组合的名称,并避免名称中的符号或空格字符。请注意COLON,HYPHEN-MINUS,FULL STOP(句号),LOW LINE (下划线),明确允许MIDDLE DOT。
ASCII符号和标点符号以及相当大的一组Unicode符号字符将从名称中排除,因为它们在XML文档外部使用XML名称的上下文中更有用作为分隔符。提供此组可以为这些上下文提供有关不能成为XML名称一部分的内容的硬性保证。字符#x037E,GREEK QUESTION MARK被排除在外,因为当标准化时它变成了分号,这可能会改变实体引用的含义。“
据我所知,几乎所有事情都有。正如Gordon在下面所述,使用了解规则的解析器是最好的!