2014-11-04 24 views
3

我想驗證html頁面中的文本輸入字段以僅接受西里爾文字母。我一直在使用這樣的正則表達式編寫的驗證代碼在JavaScript:爲什麼西裏爾字母的正則表達式會錯過一個字母?

var namevalue = document.getElementById("name") 
var letters = /^[А-Яа-я]+$/; 
if (namevalue.matches(letters)) { 
    alert("Accepted"); 
} 
else { 
    alert("Enter only cyrillic letters"); 
} 

此代碼工作正常,所有的西裏爾字母除外Ёе

+0

試試這個發現ёЁ:'VAR字母=/^ [А-Яа-яёЁ] + $ /;' – 2014-11-04 09:22:31

+0

@MarkZucchini:這不是角色類如何工作。刪除'|' – Cerbrus 2014-11-04 09:23:13

+0

這可能會有所幫助:http://en.wikipedia。org/wiki/Cyrillic_script#Computer_encoding – nhahtdh 2014-11-04 09:28:52

回答

1

可以在西里爾擴展,而不是在А-Яа-я牛逼

1

Ë不一定西裏爾字母,因此,沒有在您使用的А-Яа-я範圍內發現。

是你的Ë西里爾文:U+0401或拉丁文:U+00CB

如果你也想趕上非西里爾Ë的,你可能要添加這個範圍內的正則表達式:À-ÿ

alert(JSON.stringify("Ëë".match(/^[À-ÿ]+$/)))

如果你只是想趕上Ë在西里爾文字母表中,試試這個:

而不是開始您的範圍在U+0410А),從開始(Ѐ)和U+045F結束它(џ):

alert(JSON.stringify("Ёё".match(/^[Ѐ-џ]+$/)))

(這最後的範圍應包括完整的西裏爾字母。)

來源:Unicode character codes.您可以使用此頁檢查你需要添加到你的正則表達式的範圍。

+1

我不知道如何說第一個選項。它在視覺上類似於西里爾文的元音變音(U + 0451),但它是拉丁文字(不太可能混合西里爾文本)。我認爲你的第二個解決方案可能是OP想要的,但它會包括一些未使用的西里爾字符。 – nhahtdh 2014-11-04 09:27:38

+0

是的,這有點問題。我對西里爾語不熟悉,所以我不知道字符是什麼,也沒有使用。如果你是,請建議一個更好的範圍來使用:-) – Cerbrus 2014-11-04 09:29:25

+1

你會一直有未使用的西里爾字符,除非你只是想迎合一種語言。它們全部用於* some *語言(o/w它們不存在!),但沒有* single *語言全部使用它們 – blgt 2014-11-04 09:31:54

1

問題爲什麼ё不工作,因爲它超出範圍Aа-ЯяAа-Яа is in a 基本西裏爾字母[0430-044F],但ё不在基本西裏爾字母ё屬於西里爾文擴展[0400-045F]。因爲JavaScript正則表達式引擎不是通過字母本身進行比較,而是通過它的charcode進行比較,所以ё就超出了範圍。

因爲我相信你的意思是俄羅斯現代語言,其中儘管ё是罕見的,但仍被廣泛使用 我建議這個解決方案

var namevalue = document.getElementById("name") 

// please note that I added to your pattern "еЁ". 
// now this matches all Russian cyrillic letters both small and caps 
// plus ё and Ё 
var letters = /^[А-Яа-яёЁ]+$/; 

if (namevalue.matches(letters)) { 
    alert("Accepted"); 
} 
else { 
    alert("Enter only cyrillic letters"); 
} 

不幸與A-ЯЁ問題在Unicode規範深埋。沒有簡單而簡單的解決方案。因此,對於強大的編程,您需要始終爲這種情況做好準備。

+2

由於JS確保正確的大小寫摺疊,因此可以簡單地使用'/^[аё] + $/i'。 – georg 2014-11-04 14:45:27

相關問題