2010-01-06 164 views
26

我想匹配一個字符串以確保它只包含字母。測試字符串是否只包含字母(a-z +éöêêøøetc ..)

我已經得到了這一點,它工作得很好:

var onlyLetters = /^[a-zA-Z]*$/.test(myString); 

因爲我講另一種語言也一樣,我需要讓所有的字母,不只是A-Z。又例如:

é ü ö ê å ø 

沒有人知道是否有一個全球性的'alpha'術語,它包括所有的字母用正則表達式使用?或者更好,有沒有人有某種解決方案?

非常感謝

編輯: 只是意識到你可能也想允許「 - 」和「」櫃面像雙名的:「瑪麗安」或「瑪麗安」

+3

的[A-ZA- Z]的東西,因爲字母和數字是連續的ASCII碼,所以除非你的語言實現正則表達式中有一個內置函數,或者你的字符串編碼中的特殊字符是連續的,否則你不得不全部寫出它們。 – 2010-01-06 14:15:26

+0

也許我應該做相反: 檢查字符串是否不包含任何數字或特殊字符,如* - 。 呃概率不會工作,因爲ø概率被計算爲特殊字符 darn – patad 2010-01-06 14:21:46

+0

什麼字符算作字母?示例:$,€,æ,ʩ – GvS 2010-01-06 14:23:41

回答

25

我不知道這樣做的實際原因,但是如果你想用它來預先檢查用戶暱稱等登錄名,我建議你自己輸入一些字符, T選用全「阿爾法」字,你會以Unicode發現,因爲你可能不會發現下面的字母光學區別:

А ≠ A ≠ Α # cyrillic, latin, greek 

在這種情況下,最好到指定允許字母手動,如果你想盡量減少帳戶僞造等。

加成

好吧,如果它是被認爲是不唯一的一個領域,我會允許希臘也是如此。當我強迫用戶將其名稱更改爲拉丁版時,我感覺不太舒服。

但是對於像暱稱這樣的獨特領域,您需要爲網站的其他訪問者提供一個提示,確實是他們認爲它的暱稱。已經足夠壞了,人們會與我交換我和我的賬戶。當然,這取決於你的用戶。但要確定我認爲只允許使用基本的拉丁語+符號更好。 (也許看看這個名單:Latin-derived_alphabet

作爲一個未經測試的建議(以 ' - ', '_' 和'「):

/^[a-zA-Z\-_ ’'‘ÆÐƎƏƐƔIJŊŒẞÞǷȜæðǝəɛɣijŋœĸſßþƿȝĄƁÇĐƊĘĦĮƘŁØƠŞȘŢȚŦŲƯY̨Ƴąɓçđɗęħįƙłøơşșţțŧųưy̨ƴÁÀÂÄǍĂĀÃÅǺĄÆǼǢƁĆĊĈČÇĎḌĐƊÐÉÈĖÊËĚĔĒĘẸƎƏƐĠĜǦĞĢƔáàâäǎăāãåǻąæǽǣɓćċĉčçďḍđɗðéèėêëěĕēęẹǝəɛġĝǧğģɣĤḤĦIÍÌİÎÏǏĬĪĨĮỊIJĴĶƘĹĻŁĽĿʼNŃN̈ŇÑŅŊÓÒÔÖǑŎŌÕŐỌØǾƠŒĥḥħıíìiîïǐĭīĩįịijĵķƙĸĺļłľŀʼnńn̈ňñņŋóòôöǒŏōõőọøǿơœŔŘŖŚŜŠŞȘṢẞŤŢṬŦÞÚÙÛÜǓŬŪŨŰŮŲỤƯẂẀŴẄǷÝỲŶŸȲỸƳŹŻŽẒŕřŗſśŝšşșṣßťţṭŧþúùûüǔŭūũűůųụưẃẁŵẅƿýỳŷÿȳỹƴźżžẓ]$/.test(myString) 

另一個編輯: 我已經添加了譬如O'Neill或O'Reilly等人的撇號。 (對於無法正確輸入捲曲字符的人來說,筆直的和反轉的撇號)。

+0

好點。 它用於表單和名稱輸入。 來思考吧,我看到了大量的「選擇用戶名(A-Z 0-9 - 。)」 然後如果你是希臘人,我想你只是倒黴:-p – patad 2010-01-06 14:34:11

+0

哇看看那!看起來像你設法抓住所有有史以來的字符:-p 它工作的很棒!好工作!感謝那! – patad 2010-01-06 15:37:05

+1

我認爲正則表達式可以通過使用字符範圍有所改善。例如:'[A-Za-zÀ-ÿ]'將會捕獲所有的ASCII字母。查看http://en.wikipedia.org/wiki/List_of_Unicode_characters查看完整列表。 – DisgruntledGoat 2010-01-08 12:28:38

1

在其他正則表達式方言中有一些捷徑可以實現 - 請參閱this page。但我不相信JavaScript中有任何標準化的 - 當然這不會被所有瀏覽器支持。

+0

特別是,他似乎想要的是'\ p {L}'aka'\ p {Letter}' – MSalters 2010-01-06 14:24:04

6

應該有,但正則表達式將是本地化的依賴。因此,例如,如果您在美國本地化,則不會過濾é ü ö ê å ø。爲了確保您的網站在所有本地化中都能做到您想要的內容,您應該明確地寫出類似於您已經在做的表單中的字符。

我知道的唯一標準的是\w,它可以匹配所有字母數字字符。您可以通過運行兩個正則表達式來執行「標準」方法,一個用於驗證\w匹配,另一個用於驗證\d(所有數字)不匹配,這將導致保證僅有alpha的字符串。同樣,我強烈建議你不要使用這種技術,因爲不能保證\w將在給定的本地化中代表什麼,但這確實回答了你的問題。

5

我對JavaScript沒有任何瞭解,但是如果它有適當的Unicode支持,請將字符串轉換爲分解形式,然後從中刪除變音符號([\u0300-\u036f\u1dc0-\u1dff])。那麼你的信件只能是ASCII碼。

+0

這不起作用,因爲他的一些字母不僅僅是變音ASCII。例如「ø」被提及,並且據我所知,這不是'o'的變音符號。 – 2010-01-06 14:20:21

+1

嗯,是的。但是如果他要列舉所有有效的角色,那麼做這個變音技巧將會爲他節省不少枚舉,即使他必須單獨指定「ø」。 – 2010-01-06 14:30:20

5

你可以使用黑名單而不是白名單。這樣你只能刪除你不需要的字符。

+0

從來沒有聽說過它,但它有點說明問題。 你不只是檢查天氣它不包含這個等? – patad 2010-01-06 14:42:00

+0

黑名單是排除你不需要的東西。白名單隻允許你需要的東西。當你只想禁止某些字符如/或<時,使用黑名單。 – Hazior 2010-01-06 14:45:04

+0

那麼你是以特殊的方式聲明一個黑名單還是隻是一個常規的正則表達式,表示「不包含」而不是? – patad 2010-01-06 14:50:48

7

這可能很棘手,不幸的是JavaScript對國際化的支持很差。要做到這一點檢查你將不得不創建自己的角色類。這是因爲,例如,\w[0-9A-Z_a-z]相同,這對您沒有多大幫助,並且在Javascript中沒有像[[:alpha:]]這樣的內容。但是因爲聽起來你只會使用另一種語言,所以你可以在角色類中添加其他角色。如果myString的長度超過一個字符,我認爲你需要在你的正則表達式中使用?*

完整的例子,

/^[a-zA-Zéüöêåø]*$/.test(myString);

+0

謝謝!錯過了*最後 – patad 2010-01-06 14:51:22

+0

歡迎您:) – 2010-01-06 14:58:55

9

你不能在JS做到這一點。它具有非常有限的正則表達式和規範化器支持。你將需要構建一個冗長的,不可維護的字符數組,全部可能的拉丁字符與變音標記(我猜有大約500個不同的字符)。如果需要,在Ajax的幫助下,將驗證任務委託給使用其他語言並具有更多正則表達式功能的服務器端。

在完整的正則表達式環境中,您可以測試字符串是否匹配\p{L}+。這裏有一個Java example

boolean valid = string.matches("\\p{L}+"); 

或者,你也可以normailze文本擺脫辨別標誌並檢查它是否只包含[A-Za-z]+。這裏是一個Java example

string = Normalizer.normalize(string, Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
boolean valid = string.matches("[A-Za-z]+"); 

PHP支持類似的功能。

+0

這個解決方案看起來不錯,雖然http://stackoverflow.com/a/18391901/759452,你有什麼看法? – 2014-09-16 14:30:59

+0

關於你的另一點「在一個完整的正則表達式環境中......」這個polyfill可能會做這個工作https://github.com/slevithan/xregexp,請注意,我沒有討論驗證肯定應該發生在服務器上的事實(我會使用JS驗證作爲「豪華」功能來減少對服務器的調用次數)。 – 2014-09-16 14:37:11

3

您可以使用黑名單 - 要排除的字符列表。

此外,在服務器端驗證輸入非常重要,不僅在客戶端!客戶端可以輕鬆繞過。

12
var onlyLetters = /^[a-zA-Z\u00C0-\u00ff]+$/.test(myString) 
1

我在使用轉換器之前檢查,但它仍然不是友好的所有語言。 我不確定這是可能的。

function noExtendedChars(input_name){ 

    var whitelist = [ 
     ['a', 'à','á','â','ä','æ','ã','å','ā'], 
     ['c', 'ç', 'ć', 'č'], 
     ['e', 'è','é','ê','ë','ē','ė','ę'], 
     ['i', 'ï','ï','í','ī','į','î'], 
     ['l', 'ł'], 
     ['n', 'ñ', 'ń'], 
     ['o', 'ô', 'ö', 'ò', 'ó', 'œ', 'ø', 'ō', 'õ' ], 
     ['s', 'ß', 'ś', 'š' ], 
     ['u', 'û', 'ü', 'ù', 'ú', 'ū'], 
     ['y', 'ÿ'], 
     ['z', 'ž', 'ź', 'ż'] 
     ]; 

    for(b=0; b < blacklist.length; b++){ 
     var r= blacklist[b]; 
     for (a=1; a < r.length; a++){ 
      input_name = input_name.replace(new RegExp(r[a], "gi") , r[0]); 
     } 
    } 
    return input_name; 

} 
8

當我試圖執行@ Debilski的解決方案的JavaScript不喜歡擴展的拉丁字符 - 我不得不對他們的代碼,如JavaScript逃脫:

// The huge unicode escape string is equal to ÆÐƎƏƐƔIJŊŒẞÞǷȜæðǝəɛɣijŋœĸſßþƿȝĄƁÇĐƊĘĦ 
// ĮƘŁØƠŞȘŢȚŦŲƯY̨Ƴąɓçđɗęħįƙłøơşșţțŧųưy̨ƴÁÀÂÄǍĂĀÃÅǺĄÆǼǢƁĆĊĈČÇĎḌĐƊÐÉÈĖÊËĚĔĒĘẸƎ 
// ƏƐĠĜǦĞĢƔáàâäǎăāãåǻąæǽǣɓćċĉčçďḍđɗðéèėêëěĕēęẹǝəɛġĝǧğģɣĤḤĦIÍÌİÎÏǏĬĪĨĮỊ 
// IJĴĶƘĹĻŁĽĿʼNŃN̈ŇÑŅŊÓÒÔÖǑŎŌÕŐỌØǾƠŒĥḥħıíìiîïǐĭīĩįịijĵķƙĸĺļłľŀʼnńn̈ňñ 
// ņŋóòôöǒŏōõőọøǿơœŔŘŖŚŜŠŞȘṢẞŤŢṬŦÞÚÙÛÜǓŬŪŨŰŮŲỤƯẂẀŴẄǷÝỲŶŸȲỸƳŹŻŽẒŕřŗſśŝšşșṣßťţṭ 
// ŧþúùûüǔŭūũűůųụưẃẁŵẅƿýỳŷÿȳỹƴźżžẓ 

function isAlpha(string) { 
    var patt = /^[a-zA-Z\u00C6\u00D0\u018E\u018F\u0190\u0194\u0132\u014A\u0152\u1E9E\u00DE\u01F7\u021C\u00E6\u00F0\u01DD\u0259\u025B\u0263\u0133\u014B\u0153\u0138\u017F\u00DF\u00FE\u01BF\u021D\u0104\u0181\u00C7\u0110\u018A\u0118\u0126\u012E\u0198\u0141\u00D8\u01A0\u015E\u0218\u0162\u021A\u0166\u0172\u01AFY\u0328\u01B3\u0105\u0253\u00E7\u0111\u0257\u0119\u0127\u012F\u0199\u0142\u00F8\u01A1\u015F\u0219\u0163\u021B\u0167\u0173\u01B0y\u0328\u01B4\u00C1\u00C0\u00C2\u00C4\u01CD\u0102\u0100\u00C3\u00C5\u01FA\u0104\u00C6\u01FC\u01E2\u0181\u0106\u010A\u0108\u010C\u00C7\u010E\u1E0C\u0110\u018A\u00D0\u00C9\u00C8\u0116\u00CA\u00CB\u011A\u0114\u0112\u0118\u1EB8\u018E\u018F\u0190\u0120\u011C\u01E6\u011E\u0122\u0194\u00E1\u00E0\u00E2\u00E4\u01CE\u0103\u0101\u00E3\u00E5\u01FB\u0105\u00E6\u01FD\u01E3\u0253\u0107\u010B\u0109\u010D\u00E7\u010F\u1E0D\u0111\u0257\u00F0\u00E9\u00E8\u0117\u00EA\u00EB\u011B\u0115\u0113\u0119\u1EB9\u01DD\u0259\u025B\u0121\u011D\u01E7\u011F\u0123\u0263\u0124\u1E24\u0126I\u00CD\u00CC\u0130\u00CE\u00CF\u01CF\u012C\u012A\u0128\u012E\u1ECA\u0132\u0134\u0136\u0198\u0139\u013B\u0141\u013D\u013F\u02BCN\u0143N\u0308\u0147\u00D1\u0145\u014A\u00D3\u00D2\u00D4\u00D6\u01D1\u014E\u014C\u00D5\u0150\u1ECC\u00D8\u01FE\u01A0\u0152\u0125\u1E25\u0127\u0131\u00ED\u00ECi\u00EE\u00EF\u01D0\u012D\u012B\u0129\u012F\u1ECB\u0133\u0135\u0137\u0199\u0138\u013A\u013C\u0142\u013E\u0140\u0149\u0144n\u0308\u0148\u00F1\u0146\u014B\u00F3\u00F2\u00F4\u00F6\u01D2\u014F\u014D\u00F5\u0151\u1ECD\u00F8\u01FF\u01A1\u0153\u0154\u0158\u0156\u015A\u015C\u0160\u015E\u0218\u1E62\u1E9E\u0164\u0162\u1E6C\u0166\u00DE\u00DA\u00D9\u00DB\u00DC\u01D3\u016C\u016A\u0168\u0170\u016E\u0172\u1EE4\u01AF\u1E82\u1E80\u0174\u1E84\u01F7\u00DD\u1EF2\u0176\u0178\u0232\u1EF8\u01B3\u0179\u017B\u017D\u1E92\u0155\u0159\u0157\u017F\u015B\u015D\u0161\u015F\u0219\u1E63\u00DF\u0165\u0163\u1E6D\u0167\u00FE\u00FA\u00F9\u00FB\u00FC\u01D4\u016D\u016B\u0169\u0171\u016F\u0173\u1EE5\u01B0\u1E83\u1E81\u0175\u1E85\u01BF\u00FD\u1EF3\u0177\u00FF\u0233\u1EF9\u01B4\u017A\u017C\u017E\u1E93]+$/; 
    return patt.test(string); 
} 
+0

不錯,+1給你答案! – 2014-03-20 16:29:06

+0

感謝您的回答 – Johansrk 2015-09-04 10:22:25

+0

花了我很多時間來找到答案!謝謝 – fabiomartins87 2015-11-23 11:17:05

0
var regexp = /\B\#[a-zA-Z\x7f-\xff]+/g; 
var result = searchText.match(regexp); 
+0

儘管這段代碼可以解決這個問題,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! – kayess 2017-07-13 13:15:24

相關問題