تجد قوع من مجموعة من الكلمات
-
22-07-2019 - |
سؤال
لدي نمط مع قائمة صغيرة من الكلمات التي تعتبر غير قانونية إلى استخدام الأسماء المستعارة في نمط متغير مثل هذا:
$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 المقابل.