PHP'nin pcre fonksiyonlar üzerinden Adı doğrulama XML spesifikasyonu ile aerodinamik olduğu: Bu soru eski olduğunu rağmen şimdiye kadar cevapsız olmuştur.
XML'in tanımı en özelliklerde eleman isim hakkında oldukça açıktır (Extensible Markup Language (XML) 1.0 (Fifth Edition)):
[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)*
Bu gösterim, tek tırnaklı PHP string kelimesi kelimesine kopyalanmasına burada olduğu gibi, preg_match
a> ile kullanılacak bir UTF-8 uyumlu düzenli ifade aktarılmamış olabilir:
'~^[:A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}][:A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}.\\-0-9\\xB7\\x{0300}-\\x{036F}\\x{203F}-\\x{2040}]*$~u'
Ya da bir daha okunabilir şekilde adlandırılmış alt şablon ile başka varyantı olarak:
'~
# XML 1.0 Name symbol PHP PCRE regex <http://www.w3.org/TR/REC-xml/#NT-Name>
(?(DEFINE)
(?<NameStartChar> [:A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}])
(?<NameChar> (?&NameStartChar) | [.\\-0-9\\xB7\\x{0300}-\\x{036F}\\x{203F}-\\x{2040}])
(?<Name> (?&NameStartChar) (?&NameChar)*)
)
^(?&Name)$
~ux'
Bu desen XML ad alanı doğrulama nedenlerle (örn. için bir test NCName
için (ilk desen, ikinci bir iki görünüşlerine) dışlamak isteyebilirsiniz :
kolon içerdiğini unutmayın a>).
Kullanımı Örnek:
$name = '::...';
$pattern = '~
# XML 1.0 Name symbol PHP PCRE regex <http://www.w3.org/TR/REC-xml/#NT-Name>
(?(DEFINE)
(?<NameStartChar> [:A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}])
(?<NameChar> (?&NameStartChar) | [.\\-0-9\\xB7\\x{0300}-\\x{036F}\\x{203F}-\\x{2040}])
(?<Name> (?&NameStartChar) (?&NameChar)*)
)
^(?&Name)$
~ux';
$valid = 1 === preg_match($pattern, $name); # bool(true)
XML
(alt ya da büyük harflerle) ile başlayan bir eleman ismi mümkün olmayacağını söyleyerek doğru değildir. <XML/>
mükemmel bir iyi biçimli XML ve XML
mükemmel bir iyi biçimli eleman adıdır.
Bu tür isimler reserved for standardization (XML versiyonu yukarıda 1.0 ve üzeri) olan iyi oluşturulmuş eleman isimleri alt kümesi olan sadece budur. Bu (iyi-oluşturulmuş) elemanı adı bir dize karşılaştırma ile ayrılmış olup olmadığını test etmek kolaydır:
$reserved = $valid && 0 === stripos($name, 'xml'));
ya da alternatif başka bir düzenli ifade:
$reserved = $valid && 1 === preg_match('~^[Xx][Mm][Ll]~', $name);
Ayrılmış adlar için PHP's DOMDocument
can not testi, en azından bunu yapmak için nasıl bir yol bilmiyorum ve ben çok arıyorum oldum.
Geçerli bir öğe adı böyle bir beyanı sağlanmıştır burada sorunun kapsamı dışında gibi görünüyor bir Unique Element Type Declaration hangi gerekiyor. Bu nedenle cevabı dikkat almaz. Bir eleman türü bildirimi orada olurdu, sadece tüm (harf duyarlı) isimleri bir beyaz liste karşı doğrulamak gerekir, bu yüzden basit bir harf duyarlı dize karşılaştırma olacaktır.
Excursion: What does DOMDocument
Düzenli İfade için farklı mı? Em>
Bir ile karşılaştırıldığında DOMDocument
/ DOMElement
, geçerli bir öğe adı nitelendirir bazı farklılıklar vardır. DOM uzantısı doğrular ne daha az öngörülebilir hale karma mod çeşit olduğunu. Aşağıdaki gezi davranışı gösterir ve onu kontrol etmek için nasıl gösterir.
En $name
almak ve bir öğe örneğini alalım:
$element = new DOMElement($name);
Sonuç değişir:
Yani ilk karakter karşılaştırma modu hakkında karar verir.
Bir düzenli ifade özel XML 1.0 Name
simgesi burada, kontrol etmek için ne yazılır.
Bir kolon adını önek tarafından DOMElement
ile aynı elde edebilirsiniz:
function isValidXmlName($name)
{
try {
new DOMElement(":$name");
return TRUE;
} catch (DOMException $e) {
return FALSE;
}
}
Açıkça QName
Bu çevirerek elde edilebilir kontrol etmek için bir PrefixedName
durumda öyle bir UnprefixedName
:
function isValidXmlnsQname($qname)
{
$prefixedName = (!strpos($qname, ':') ? 'prefix:' : '') . $qname;
try {
new DOMElement($prefixedName, NULL, 'uri:ns');
return TRUE;
} catch (DOMException $e) {
return FALSE;
}
}