문자열에 문자(a-z + é ü ö ê å ø 등)만 포함되어 있는지 테스트합니다.

StackOverflow https://stackoverflow.com/questions/2013451

  •  19-09-2019
  •  | 
  •  

문제

문자열을 일치시켜 문자만 포함되어 있는지 확인하고 싶습니다.

나는 이것을 가지고 있고 잘 작동합니다 :

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

하지만

저도 다른 언어를 사용하기 때문에 A-Z뿐만 아니라 모든 문자를 허용해야 합니다.또한 예를 들면 다음과 같습니다.

é ü ö ê å ø

글로벌이 있는지 아는 사람 있나요? 'alpha' regExp와 함께 사용할 모든 문자를 포함하는 용어?아니면 더 나은 해결책이 있는 사람이 있나요?

정말 감사합니다

편집하다:다음과 같은 이중 이름의 경우 '-' 및 ''를 허용하고 싶을 수도 있다는 것을 깨달았습니다.'메리 앤' 또는 '메리 앤'

도움이 되었습니까?

해결책

이렇게 하는 실제 이유는 모르겠지만, 예를 들어 로그인 이름이나 사용자 닉네임에 대한 사전 확인으로 사용하려면 문자를 직접 입력하고 전체를 사용하지 않는 것이 좋습니다. 유니코드에서 '알파' 문자를 찾을 수 있습니다. 다음 문자에서는 광학적 차이를 찾을 수 없기 때문입니다.

А ≠ A ≠ Α  # cyrillic, latin, greek

이러한 경우 계정 위조 등을 최소화하려면 허용되는 문자를 수동으로 지정하는 것이 좋습니다.

덧셈

글쎄요, 고유하지 않은 것으로 예상되는 필드에 대한 것이라면 그리스어도 허용하겠습니다.사용자에게 이름을 라틴어 버전으로 변경하도록 강요하면 기분이 좋지 않을 것입니다.

하지만 닉네임과 같은 고유한 필드의 경우 사이트의 다른 방문자에게 실제로 그들이 생각하는 닉네임이라는 힌트를 제공해야 합니다.사람들이 이미 I와 I를 교환하여 계정을 가짜로 만들 정도로 나쁜 것입니다.물론 이는 사용자에 따라 다릅니다.하지만 확실히 기본 라틴어 + 발음 구별 부호만 허용하는 것이 더 낫다고 생각합니다.(아마도 다음 목록을 살펴보십시오. 라틴어 파생_알파벳)

테스트되지 않은 제안('-', '_' 및 ' ' 포함):

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

또 다른 편집:O'Neill 또는 O'Reilly와 같은 이름을 가진 사람들을 위해 아포스트로피를 추가했습니다.(그리고 곱슬곱슬한 아포스트로피를 제대로 입력할 수 없는 사람들을 위해 직선 및 역아포스트로피도 있습니다.)

다른 팁

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

JS에서는 이것을 할 수 없습니다. 그것은 매우 제한된 정규화 및 정상화 지원을 가지고 있습니다. 길고 유지할 수없는 캐릭터 배열을 구성해야합니다. 모두 대규모 자국이있는 라틴 문자가 가능한 라틴 문자 (약 500 개의 다른 것들이 있다고 생각합니다). AJAX의 도움으로 필요한 경우 더 많은 정규 CAPABILTIS를 사용하여 다른 언어를 사용하는 서버쪽에 유효성 검사 작업을 위임하십시오.

완전한 깃발 정규 환경에서는 문자열이 일치하는지 테스트 할 수 있습니다. \p{L}+. 여기에 있습니다 자바 예:

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

또는 텍스트를 규범을 지정하여 디아크리처 마크를 제거하고 포함되어 있는지 확인할 수도 있습니다. [A-Za-z]+ 뿐. 여기에 다시 a 자바 예:

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

PHP는 유사한 기능을 지원합니다.

@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);
}

이것은 까다로울 수 있습니다. 불행히도 JavaScript는 국제화에 대한 지원이 상당히 열악합니다. 이 점검을하려면 자신의 캐릭터 클래스를 만들어야합니다. 예를 들어 \w 와 같다 [0-9A-Z_a-z] 많은 도움이되지 않고 같은 것이 없습니다. [[:alpha:]] JavaScript에서. 그러나 다른 langauge 만 사용하는 것처럼 들리기 때문에 다른 캐릭터를 캐릭터 클래스에 추가 할 수 있습니다.

그건 그렇고, 나는 당신이 필요하다고 생각합니다 ? 또는 * MyString이 하나의 캐릭터보다 길을 수 있다면 Regexp에서.

전체 예,

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

필요하지만, Regex는 현지화에 종속 될 것입니다. 따라서, é ü ö ê å ø 예를 들어 미국 현지화에있는 경우 필터링되지 않습니다. 웹 사이트가 모든 지역화에서 원하는 것을 수행하도록하려면 이미하고있는 것과 비슷한 형태로 캐릭터를 명시 적으로 작성해야합니다.

내가 알고있는 유일한 표준은 \w, 모든 영숫자 캐릭터와 일치합니다. 당신은 두 개의 regex를 실행하여 "표준"방식으로 할 수 있습니다. \w 일치하고 다른 하나는 그것을 확인합니다 \d (모든 숫자)가 일치하지 않으므로 알파 전용 문자열이 보장됩니다. 다시, 나는 당신 이이 기술을 사용하지 말라고 강력히 촉구합니다. \w 주어진 현지화를 나타내지 만 이것은 귀하의 질문에 답변합니다.

JavaScript에 대해서는 아무것도 모르지만 적절한 유니 코드 지원이있는 경우 문자열이 분해 된 형태로 변환 한 다음 Diacritics를 제거하십시오 ([\u0300-\u036f\u1dc0-\u1dff]). 그러면 당신의 편지는 ASCII 일뿐입니다.

당신은 화이트리스트 대신 블랙리스트를 사용할 수 있습니다. 그렇게하면 필요하지 않은 문자 만 제거합니다.

배제 할 문자 목록 인 블랙리스트를 사용할 수 있습니다.

또한 클라이언트 측뿐만 아니라 서버 측의 입력을 확인하는 것이 중요합니다! 클라이언트 측은 쉽게 우회 할 수 있습니다.

다른 정규 표현 방언에서 이것을 달성하기위한 바로 가기가 있습니다. 이 페이지. 그러나 나는 JavaScript에 표준화 된 것들이 있다고 생각하지 않습니다. 확실히 모든 브라우저에서 지원되는 것은 아닙니다.

확인하기 전에 컨버터를 사용하고 있지만 모든 언어에 여전히 친숙하지는 않습니다. 나는 그것이 가능하다는 것을 확신하지 못한다.

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;

}
var regexp = /\B\#[a-zA-Z\x7f-\xff]+/g; 
var result = searchText.match(regexp);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top