اختبار إذا كانت السلسلة تحتوي على أحرف فقط (AZ + É Ü Ö å Ø etc ..)

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

  •  19-09-2019
  •  | 
  •  

سؤال

أريد أن أتفق مع سلسلة للتأكد من أنه يحتوي على أحرف فقط.

لقد حصلت على هذا ويعمل على ما يرام:

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

لكن

منذ أن أتحدث لغة أخرى أيضا، أحتاج إلى السماح لجميع الحروف، وليس فقط من الألف إلى الياء. أيضا على سبيل المثال:

é ü ö ê å ø

هل يعرف أحد إذا كان هناك عالمي 'alpha' المصطلح الذي يشمل جميع الحروف لاستخدامها مع Regoxp؟ أو حتى أفضل، هل لدى أي شخص نوع من الحل؟

شكرا جزيلا

تعديل:أدركت فقط أنك قد ترغب أيضا في السماح "-" و "Incase باسم مزدوج مثل:" ماري آن "أو" ماري آن "

هل كانت مفيدة؟

المحلول

لا أعرف السبب الفعلي للقيام بذلك، ولكن إذا كنت ترغب في استخدامه كحقق مسبقة، قل أسماء تسجيل الدخول ألقاب المستخدم، أقترح عليك إدخال الأحرف بنفسك ولا تستخدم الكل ستجد أحرف "ألفا" في Unicode، لأنك ربما لن تجد فرقا بصري في الحروف التالية:

А ≠ A ≠ Α  # cyrillic, latin, greek

في مثل هذه الحالات، من الأفضل تحديد الحروف المسموح بها يدويا إذا كنت ترغب في تقليل الحساب المزيف ومثله.

إضافة

حسنا، إذا كان هناك حقل من المفترض أن يكون فريدا من نوعه، فسوف أسمح باللغة اليونانية أيضا. لن أشعر أنني بحالة جيدة عندما أجبر المستخدمين على تغيير اسمهم إلى نسخة مضادة.

ولكن بالنسبة لحقول فريدة من نوعها مثل الأسماء المستعارة، تحتاج إلى إعطاء زوارك الآخرين في الموقع تلميح، إنه حقا الاسم المستعار الذي يعتقدون أنه. سيئة بما فيه الكفاية أن الناس سوف حسابات مزيفة مع interchanging i و l بالفعل. بالطبع، إنه شيء يعتمد على مستخدمي المستخدمين؛ ولكن للتأكد من أنني أعتقد أنه من الأفضل السماح للتشكيل اللاتينية + الأساسي فقط. (ربما إلقاء نظرة على هذه القائمة: latin-derived_alphabet.)

كإشعار غير مختبر (مع '-'، '_' و '):

/^[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. لديها دعم Regex محدود للغاية ومطبقة. ستحتاج إلى إنشاء مجموعة أحرف طويلة وغير قابلة للإصلاح مع الكل الأحرف اللاتينية المحتملة ذات العلامات التشكيلية (أعتقد أن هناك حوالي 500 شخص مختلف). بدلا من تفويض مهمة التحقق من الصحة إلى جانب الخادم الذي يستخدم لغة أخرى مع مزيد من كابيلات Regex، إذا لزم الأمر بمساعدة AJAX.

في بيئة REGEX كاملة كاملة، يمكنك فقط اختبار ما إذا كانت مطابقة السلسلة \p{L}+. وبعد هنا مثال جافا:

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

بدلا من ذلك، يمكنك أيضا normilze النص للتخلص من العلامات التشكيلية وتحقق مما إذا كان يحتوي على [A-Za-z]+ فقط. هنا مرة أخرى مثال جافا:

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

PHP يدعم وظائف مماثلة.

عندما حاولت تطبيق حل @ debilski جافا سكريبت أن جافا سكريبت لم يعجبني الأحرف اللاتينية الموسعة - كان علي أن أرمزها كما يهرب 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);
}

هذا يمكن أن يكون صعبا، للأسف جافا سكريبت لديه دعم ضعيف جدا للتدويل. للقيام بذلك، سيتعين عليك إنشاء فئة الشخصية الخاصة بك. هذا لأنه على سبيل المثال، \w بالضبط مثل [0-9A-Z_a-z] الذي لن يساعدك كثيرا وليس هناك أي شيء [[:alpha:]] في جافا سكريبت. ولكن نظرا لأن الأمر يبدو وكأنك ستستخدم فقط Langauge واحد، فربما يمكنك فقط إضافة تلك الأحرف الأخرى إلى فئة الشخصية الخاصة بك.

بالمناسبة، أعتقد أنك سوف تحتاج ? أو * في Regexp الخاص بك هناك إذا كان myString يمكن أن يكون أطول من حرف واحد.

المثال الكامل،

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

يجب أن يكون هناك، لكن Regex سيكون التوطين تعتمد. هكذا، é ü ö ê å ø لن يتم تصفيتها إذا كنت في توطين الولايات المتحدة، على سبيل المثال. لضمان أن موقع الويب الخاص بك يفعل ما تريد عبر جميع الأحرفات، يجب عليك كتابة الأحرف بشكل صريح في شكل مشابه لما تقوم به بالفعل.

المعيار الوحيد الذي أدركه \w, ، والتي من شأنها أن تطابق جميع الأحرف الأبجدية الرقمية. يمكنك أن تفعل ذلك بطريقة "قياسية" عن طريق تشغيل اثنين Regex، واحد للتحقق \w المباريات وآخر للتحقق من ذلك \d (جميع الأرقام) لا تتطابق، والتي ستؤدي إلى سلسلة ألفا مضمونة فقط. مرة أخرى، سأحثك بشدة عدم استخدام هذه التقنية لأنه لا يوجد ضمان ما \w سوف يمثل في توطين معين، ولكن هذا يجيب على سؤالك.

لا أعرف أي شيء عن JavaScript، ولكن إذا كان لديه دعم Unicode مناسب، فقم بتحويل السلسلة إلى نموذج متحلل، ثم قم بإزالة التشكيلات منه ([\u0300-\u036f\u1dc0-\u1dff]). ثم رسالتك ستكون فقط ascii تلك.

يمكنك استخدام قائمة سوداء بدلا من البيض. بهذه الطريقة يمكنك فقط إزالة الأحرف التي لا تحتاج إليها.

يمكنك استخدام قائمة سوداء - قائمة الأحرف لاستبعادها.

أيضا، من المهم التحقق من المدخلات على جانب الخادم، ليس فقط على جانب العميل! يمكن تجاوز جانب العميل بسهولة.

هناك بعض الاختصارات لتحل هذا في لهجات التعبير العادية الأخرى - انظر هذه الصفحة. وبعد لكنني لا أعتقد أن هناك أي منها موحدة في جافا سكريبت - بالتأكيد لن يتم دعمها من قبل جميع المتصفحات.

أنا أستخدم محول قبل التحقق، لكنه لا يزال غير ودود لجميع اللغات. لست متأكدا من ذلك ممكن.

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