2010-01-06 29 views
26

Tôi muốn khớp một chuỗi để đảm bảo chuỗi chỉ chứa các chữ cái.Kiểm tra nếu chuỗi chỉ chứa các chữ cái (a-z + é ü ö ê ê ø ø vv ..)

Tôi đã có này và nó hoạt động tốt:

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

NHƯNG

Kể từ khi tôi nói ngôn ngữ khác quá, tôi cần phải cho phép tất cả các chữ, không chỉ là A-Z. Ví dụ:

é ü ö ê å ø 

có ai biết nếu có toàn bộ chữ cái để sử dụng với regExp không? Hoặc thậm chí tốt hơn, không ai có một số loại giải pháp?

Thanks a lot

EDIT: Chỉ cần nhận ra rằng bạn cũng có thể muốn cho phép '-' và '' trong trường hợp của một tên đôi như: 'Mary-Ann' hoặc 'Mary Ann'

+3

Các [a-zA- Z] hoạt động bởi vì các chữ cái và số là mã ASCII liên tiếp, vì vậy trừ khi có một hàm dựng sẵn trong việc thực hiện ngôn ngữ Regex của bạn hoặc các ký tự đặc biệt liên tiếp trong mã hóa chuỗi của bạn, rất có thể bạn sẽ phải viết tất cả chúng ra . –

+0

có lẽ tôi nên làm điều ngược lại: kiểm tra xem chuỗi có KHÔNG chứa bất kỳ chữ số hoặc ký tự đặc biệt nào như * -. uhh prob wont làm việc anyway kể từ khi prob được tính vào các ký tự đặc biệt darn – patad

+0

Những ký tự nào được tính là chữ cái? Ví dụ: $, €, æ, ʩ – GvS

Trả lời

25

Tôi không biết lý do thực sự để làm điều này, nhưng nếu bạn muốn sử dụng nó như là một kiểm tra trước, ví dụ, tên đăng nhập tên người dùng oder, tôi khuyên bạn nên nhập các ký tự và don ' t sử dụng toàn bộ các nhân vật 'alpha' bạn sẽ tìm thấy trong unicode, vì có thể bạn sẽ không tìm thấy một sự khác biệt quang trong các chữ cái sau đây:

А ≠ A ≠ Α # cyrillic, latin, greek 

trong trường hợp này nó tốt hơn để xác định các chữ cái cho phép bằng tay nếu bạn muốn giảm thiểu tài khoản giả mạo và như vậy.

Addition

Vâng, nếu đó là một lĩnh vực được coi là không duy nhất, tôi sẽ cho phép Hy Lạp là tốt.Tôi sẽ không cảm thấy khỏe khi tôi buộc người dùng thay đổi tên của họ thành một phiên bản được quảng cáo.

Nhưng đối với các trường duy nhất như biệt hiệu, bạn cần cung cấp cho khách truy cập khác của trang web một gợi ý, đó thực sự là biệt hiệu mà họ nghĩ. Đủ tệ là mọi người sẽ có tài khoản giả mạo với sự hoán đổi tôi và tôi đã sẵn sàng. Tất nhiên, đó là điều gì đó phụ thuộc vào người dùng của bạn; nhưng để chắc chắn tôi nghĩ tốt hơn là chỉ cho phép các dấu phẩy Latin + cơ bản. (Có thể có một cái nhìn vào danh sách này: Latin-derived_alphabet)

Như một gợi ý chưa được kiểm tra (với '-', '_' và ' '):

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

Một biên tập: Tôi đã thêm dấu nháy đơn cho những người có tên như O'Neill hoặc O'Reilly. (Và dấu nháy thẳng và ngược lại cho những người không thể nhập đúng dấu nháy.)

+0

điểm tốt. nó dành cho biểu mẫu và đầu vào Tên. đến để suy nghĩ về nó, tôi đã thấy vô số "chọn một tên người dùng (A-Z 0-9 -.)" sau đó nếu ur Hy Lạp, tôi đoán ur chỉ không may mắn :-p – patad

+0

wow nhìn vào đó! có vẻ như bạn đã xoay xở để bắt tất cả các nhân vật ma quỷ từng được thực hiện :-p và nó hoạt động tuyệt vời! công việc tuyệt vời! cảm ơn vì điều đó! – patad

+1

Tôi tích cực rằng regex có thể được cải thiện phần nào bằng cách sử dụng các phạm vi ký tự. Một cái gì đó như: '[A-Za-zÀ-ÿ]' sẽ bắt tất cả các chữ cái ASCII. Kiểm tra http://en.wikipedia.org/wiki/List_of_Unicode_characters để biết danh sách đầy đủ. – DisgruntledGoat

1

Có một số phím tắt để đạt được điều này trong các phương ngữ biểu thức chính quy khác - xem this page. Nhưng tôi không tin rằng có bất kỳ cái nào được chuẩn hóa trong JavaScript - chắc chắn không phải nó sẽ được tất cả các trình duyệt hỗ trợ.

+0

Cụ thể, cái mà anh ta muốn là '\ p {L}' aka '\ p {Letter}' – MSalters

6

Nên có, nhưng regex sẽ phụ thuộc vào nội địa hóa. Do đó, é ü ö ê å ø sẽ không được lọc nếu bạn đang sử dụng nội địa hóa ở Hoa Kỳ. Để đảm bảo trang web của bạn thực hiện những gì bạn muốn trên tất cả các bản địa hoá, bạn nên viết rõ ràng các ký tự trong một biểu mẫu tương tự như những gì bạn đã làm.

Chỉ tiêu chuẩn duy nhất tôi biết là mặc dù là \w, sẽ khớp với tất cả các ký tự chữ và số. Bạn có thể làm điều đó theo cách "chuẩn" bằng cách chạy hai regex, một để xác minh các đối sánh \w và một để xác minh rằng \d (tất cả các chữ số) không khớp, điều này sẽ dẫn đến chuỗi alpha chỉ được đảm bảo. Một lần nữa, tôi rất muốn bạn không nên sử dụng kỹ thuật này vì không có gì đảm bảo rằng \w sẽ đại diện cho một bản địa hóa cụ thể, nhưng điều này không trả lời câu hỏi của bạn.

5

Tôi không biết gì về Javascript, nhưng nếu nó có hỗ trợ unicode thích hợp, hãy chuyển chuỗi của bạn thành dạng bị phân tách, sau đó xóa dấu phụ khỏi nó ([\u0300-\u036f\u1dc0-\u1dff]). Sau đó, các chữ cái của bạn sẽ chỉ là chữ cái ASCII.

+0

Điều này không có tác dụng vì một số chữ cái của anh ta không chỉ là ASCII diacritical. Ví dụ 'ø' đã được đề cập, và đây không phải là dấu phụ của' o' theo như tôi biết. –

+1

Hum, yeah. Nhưng nếu anh ta định liệt kê tất cả các ký tự hợp lệ, thực hiện các thủ thuật này sẽ tiết kiệm cho anh ta một vài liệt kê, ngay cả khi anh ta phải chỉ định 'ø' một cách riêng biệt. –

5

Bạn có thể sử dụng danh sách cấm thay vì danh sách trắng. Bằng cách đó bạn chỉ xóa các ký tự mà bạn không cần.

+0

không bao giờ nghe nói về nó, nhưng nó loại nói cho chính nó. không u chỉ kiểm tra thời tiết nó không chứa này mà vv? – patad

+0

Danh sách đen không bao gồm những gì bạn không cần. Danh sách trắng chỉ cho phép những gì bạn cần. Danh sách đen được sử dụng khi bạn chỉ muốn cấm các ký tự nhất định như/hoặc <. – Hazior

+0

vì vậy bạn có khai báo một danh sách đen theo cách đặc biệt hay chỉ là một cụm từ thông thường nói "không chứa" thay vì không? – patad

7

Điều này có thể khó khăn, JavaScript không may có hỗ trợ khá kém cho quốc tế. Để thực hiện việc này, bạn sẽ phải tạo lớp nhân vật của riêng mình. Điều này là do, ví dụ: \w giống với [0-9A-Z_a-z] sẽ không giúp bạn nhiều và không có bất kỳ điều gì giống như [[:alpha:]] trong Javascript. Nhưng vì có vẻ như bạn sẽ chỉ sử dụng một ngôn ngữ khác, bạn có thể chỉ cần thêm các ký tự khác vào lớp nhân vật của bạn.

Nhân tiện, tôi nghĩ bạn cần có ? hoặc * trong regexp của mình ở đó nếu myString có thể dài hơn một ký tự.

Các ví dụ đầy đủ,

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

+0

cảm ơn vì điều đó! bỏ lỡ * vào cuối – patad

+0

bạn được chào đón :) –

9

Bạn không thể làm điều này trong JS. Nó có một hỗ trợ rất hạn chế và bình thường. Bạn sẽ cần phải xây dựng một mảng ký tự dài và không thể duy trì được với tất cả ký tự latin có thể có dấu phụ (tôi đoán có khoảng 500 ký tự khác nhau). Thay vào đó ủy nhiệm nhiệm vụ xác thực cho phía máy chủ sử dụng một ngôn ngữ khác với nhiều capabilties regex, nếu cần thiết với sự trợ giúp của ajax.

Trong môi trường regex chính thức, bạn chỉ có thể kiểm tra xem chuỗi có khớp với \p{L}+ hay không. Dưới đây là một Java example:

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

Ngoài ra, bạn cũng có thể normailze văn bản để thoát khỏi các dấu phụ và kiểm tra xem nó có chứa [A-Za-z]+ chỉ. Dưới đây là một lần nữa là Java example:

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

PHP hỗ trợ các chức năng tương tự.

+0

giải pháp này có vẻ khá tốt mặc dù http://stackoverflow.com/a/18391901/759452, ý kiến ​​của bạn là gì? –

+0

Về điểm khác của bạn "Trong một môi trường regex chính thức đầy đủ ..." polyfill này có thể làm công việc https://github.com/slevithan/xregexp, lưu ý rằng tôi không thảo luận về việc xác thực chắc chắn sẽ xảy ra trên máy chủ bên cạnh (tôi muốn sử dụng JS xác nhận cũng giống như một tính năng "sang trọng" để giảm số lượng các cuộc gọi đến máy chủ). –

3

Bạn có thể sử dụng danh sách cấm - danh sách các ký tự cần loại trừ.

Ngoài ra, điều quan trọng là phải xác minh đầu vào ở phía máy chủ, không chỉ ở phía máy khách! Phía máy khách có thể được bỏ qua dễ dàng.

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

Tôi đang sử dụng bộ chuyển đổi trước khi kiểm tra nhưng vẫn không thân thiện với tất cả các ngôn ngữ. Tôi không chắc chắn điều đó là có thể.

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

Khi tôi cố gắng thực hiện @ giải pháp Debilski của JavaScript không thích các nhân vật Latin mở rộng - Tôi đã phải viết mã chúng như thoát 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

Tốt, +1 cho bạn trả lời! –

+0

Cảm ơn câu trả lời đó – Johansrk

+0

Đã cho tôi rất nhiều thời gian để tìm câu trả lời này! Cảm ơn – fabiomartins87

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

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Ngoài ra, vui lòng không cố gắng gắn mã của bạn với các nhận xét giải thích, điều này làm giảm khả năng đọc của cả mã và giải thích! – kayess

Các vấn đề liên quan