PHP正则表达式用于有效的XML标记名称

时间:2011-09-21 06:38:00

标签: php xml regex

确定字符串是否是有效的XML标记名称的一般正则表达式(用PHP术语)是什么?

我首先使用/[^>]+/i,但它也匹配4 \<<,显然不是有效的标记名称。

所以我尝试将所有有效字符组合起来,例如/[a-z][a-z0-9_-]*/i,这也是不对的,因为XML几乎允许任何外语标记名中的字符。

我现在仍然坚持 - 我应该检查是否有空白字符?或者还有更多吗?

3 个答案:

答案 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)

来自XML specification

[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在下面所述,使用了解规则的解析器是最好的!

相关问题