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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top