2010-01-06 166 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

相关问题