سؤال

لدي نمط مع قائمة صغيرة من الكلمات التي تعتبر غير قانونية إلى استخدام الأسماء المستعارة في نمط متغير مثل هذا:

$pattern = webmaster|admin|webadmin|sysadmin

باستخدام preg_match, كيف يمكنني تحقيق ذلك أن ألقاب مع هذه الكلمات المحرمة, ولكن تسجيل شيء من هذا القبيل "admin2"أو "thesysadmin"هو مسموح ؟

هذا هو التعبير لدي حتى الآن:

preg_match('/^['.$pattern.']/i','admin');

// لا ينبغي أن يسمح

ملاحظة:باستخدام \b لا تساعد كثيرا.

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

المحلول

ماذا عن عدم باستخدام التعابير المنطقية ؟
والعمل مع explode و in_array ?

على سبيل المثال هذا :

$pattern = 'webmaster|admin|webadmin|sysadmin';
$forbidden_words = explode('|', $pattern);

ينفجر النمط الخاص بك إلى مجموعة باستخدام | فاصل.


و هذا :

$word = 'admin';
if (in_array($word, $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

سوف تحصل على

admin is not OK

في حين أن هذا (نفس المدونة ؛ فقط كلمة التغييرات) :

$word = 'admin2';
if (in_array($word, $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

سوف تحصل على

admin2 is OK

بهذه الطريقة, لا داعي للقلق حول العثور على الحق في regex إلى المباراة كاملة-كلمات :إنها فقط مباراة الكلمات ;-)


تحرير : واحدة قد تكون المشكلة أن المقارنة ستكون القضية الحساسة :-(
العمل مع كل شيء في صغيرة سوف تساعد في ذلك :

$pattern = strtolower('webmaster|admin|webadmin|sysadmin');  // just to be sure ;-)
$forbidden_words = explode('|', $pattern);

$word = 'aDMin';
if (in_array(strtolower($word), $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

سوف تحصل على :

aDMin is not OK

(رأيت 'i'العلم في regex إلا بعد نشر جوابي ؛ لذا كان لتحريره)


تحرير 2 : و, إذا كنت تريد حقا أن تفعل ذلك مع regex ، عليك أن تعرف أن :

  • ^ بداية السلسلة
  • و $ علامات نهاية السلسلة

لذا شيئا من هذا القبيل ينبغي أن تفعل :

$pattern = 'webmaster|admin|webadmin|sysadmin';

$word = 'admin';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

$word = 'admin2';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

بين قوسين ربما لا تكون ضرورية ، ولكن أود أن استخدام لهم ، إلى عزل ما أردت.

و ستحصل على نفس النوع من الإخراج :

admin is not OK

admin2 is OK

ربما كنت لا ترغب في استخدام [ و ] :أنها تعني "أي الحرف الذي بين لنا" ، وليس "السلسلة بأكملها التي بيننا".

و كمرجع :دليل وتقوية بناء الجملة ;-)

نصائح أخرى

وهكذا، الكلمات المحرمة يمكن أن يكون <م> الجزء من اسم المستخدم ولكن ليس كل شيء؟

في .NET، فإن نمط يكون:

 Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)$")

وو"^" يتطابق مع بداية السلسلة، و"$" يطابق نهاية، لذلك يتطلع لتطابق تام في واحدة من تلك الكلمات. أنا غامض قليلا على بناء الجملة PHP المقابل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top