finden Auftreten einer Reihe von Wörtern
-
22-07-2019 - |
Frage
Ich habe ein Muster mit einer kleinen Liste von Worten, die als Spitznamen illegal sind in einem Mustervariable wie folgt festgelegt verwenden:
$pattern = webmaster|admin|webadmin|sysadmin
Mit preg_match
, wie kann ich erreichen, so dass Spitznamen mit diesen Worten verboten sind, aber die Registrierung etwas erlaubt ist, wie „admin2
“ oder „thesysadmin
“?
Dies ist der Ausdruck, den ich habe, so weit:
preg_match('/^['.$pattern.']/i','admin');
// Sollte nicht zulässig
. Hinweis: Mit einem \b
nicht viel helfen
Lösung
Was ist überhaupt nicht mit Regex?
Und die Arbeit mit explode
und in_array
?
Zum Beispiel würde dies tun:
$pattern = 'webmaster|admin|webadmin|sysadmin';
$forbidden_words = explode('|', $pattern);
Es explodiert Ihr Muster in ein Array, mit | als Trennzeichen.
Und dies:
$word = 'admin';
if (in_array($word, $forbidden_words)) {
echo "<p>$word is not OK</p>";
} else {
echo "<p>$word is OK</p>";
}
erhalten Sie
admin is not OK
Während dieses (gleicher Code, nur die Wortänderungen) :
$word = 'admin2';
if (in_array($word, $forbidden_words)) {
echo "<p>$word is not OK</p>";
} else {
echo "<p>$word is OK</p>";
}
erhalten Sie
admin2 is OK
Auf diese Weise kein Grund zur Sorge über die richtige regex zu finden, Voll Worte passen: es wird nur genau die Worte entspricht; -)
Edit: ein Problem könnte sein, dass der Vergleich Groß- und seine :-(
Arbeiten mit allem, was in Klein wird dabei helfen:
$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>";
}
erhalten Sie:
aDMin is not OK
(Ich sah die 'i
' Flagge in der Regex erst nach meiner Antwort veröffentlichen, so hatte es zu bearbeiten)
Edit 2: und, wenn Sie es wirklich mit einem regex tun wollen, müssen Sie das wissen:
-
^
markiert den Anfang der Zeichenfolge - und
$
markiert das Ende der Zeichenfolge
Also, so etwas wie dies tun soll:
$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>";
}
Klammern sind wahrscheinlich nicht notwendig, aber Ich mag mit ihnen zu isolieren, was ich wollte.
Und, werden Sie die gleiche Art von Ausgabe erhalten:
admin is not OK
admin2 is OK
Sie wollen wahrscheinlich nicht [
und ]
verwenden: sie bedeuten „jedes Zeichen, das zwischen uns ist“, und nicht „die gesamte Zeichenfolge, die zwischen uns ist“
Und als Referenz: Handbuch der Preg Syntax ; -)
Andere Tipps
So können die verbotenen Worte Teil von ihren Benutzernamen, aber nicht das Ganze?
In .NET, würde das Muster sein:
Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)$")
Der „^“ entspricht den Anfang der Zeichenfolge entspricht der „$“ das Ende, so sieht es nach einer genauen Übereinstimmung auf einem dieser Worte. Ich bin ein bisschen unscharf auf der entsprechenden PHP-Syntax.