2011-09-21 55 views
3

什麼是確定字符串是否爲有效XML標記名稱的良好通用正則表達式(用PHP術語說)?用於有效XML標記名稱的PHP正則表達式

我開始使用​​,但也匹配類似4 \<<這顯然不是一個有效的標籤名稱。

因此,我嘗試將所有有效的字符(如/[a-z][a-z0-9_-]*/i)組合起來,這些字符也不太正確,因爲XML幾乎允許標記名稱中的任何字符以及外語。

我被困在那 - 現在我應該檢查是否有空白字符?或者還有更多嗎?

回答

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

這是一個非常棒的主意......我怎麼能不提出t他自己... –

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)* 
+0

這看起來不錯,但我怎麼能適應在PHP正則表達式?解釋者是否理解範圍值,例如'#xC0-#xD6'? –

1

從相同的規範,但隨後多一點明確:

「文件鼓勵作者使用的是自然語言中詞的有意義的詞或組合的名字,並避免在名稱中使用符號或空格字符注意,COLON,HYPHEN-MINUS,FULL STOP(句點),LOW LINE(下劃線)和MIDDLE DOT是明確允許的

ASCII符號和標點符號n個標記以及相當大的Unicode符號字符組被排除在名稱之外,因爲它們在XML文檔之外使用XML名稱的上下文中更有用作分隔符;提供這個組給這些上下文很難保證什麼不能成爲XML名稱的一部分。 #x037E,GREEK QUESTION MARK這個字符被排除在外,因爲當它被歸一化時,它就變成了一個分號,它可以改變實體引用的含義。「

就我所能解釋的那樣,使用哪知道規則解析器纔是最好的!