Question

J'ai un modèle avec une petite liste de mots qu'il est illégal d'utiliser comme pseudonymes définis dans une variable de modèle comme celle-ci:

$pattern = webmaster|admin|webadmin|sysadmin

Avec preg_match , comment puis-je interdire les pseudonymes avec ces mots, mais en enregistrant quelque chose comme "" admin2 "? ou " thesysadmin " est autorisé?

C'est l'expression que j'ai jusqu'ici:

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

// ne devrait pas être autorisé

Remarque: l'utilisation d'un \ b n'a pas beaucoup aidé.

Était-ce utile?

La solution

Pourquoi ne pas utiliser regex du tout?
Et travailler avec les exploser et in_array ?

Par exemple, cela ferait:

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

Cela explose votre motif dans un tableau, en utilisant | comme séparateur.


Et ceci:

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

vous obtiendrez

admin is not OK

Alors que ceci (même code; seul le mot change) :

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

vous obtiendrez

admin2 is OK

De cette façon, vous n'avez pas à vous soucier de trouver la bonne expression rationnelle, à faire correspondre les mots entiers: cela ne fera que correspondre aux mots exacts; -)

Modifier: l'un des problèmes peut être que la comparaison sera sensible à la casse :-(
Travailler avec tout en minuscule aidera avec ça:

$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>";
}

vous obtiendrez:

aDMin is not OK

(j'ai vu l'indicateur ' i ' dans la regex seulement après avoir posté ma réponse; donc, j'ai dû la modifier) ??

Modifier 2: et si vous voulez vraiment le faire avec une regex, vous devez savoir que:

  • ^ marque le début de la chaîne
  • et $ marque la fin de la chaîne

Donc, quelque chose comme ceci devrait faire:

$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>";
}

Les parenthèses ne sont probablement pas nécessaires, mais j'aime les utiliser pour isoler ce que je voulais.

Et vous obtiendrez le même type de sortie:

admin is not OK

admin2 is OK

Vous ne voulez probablement pas utiliser [ et ] : ils signifient "tout caractère situé entre nous" et non "toute la chaîne qui est entre nous ".

Et, en tant que référence: manuel de la syntaxe de preg ; -)

Autres conseils

Ainsi, les mots interdits peuvent être une partie de leur nom d'utilisateur mais pas le tout?

Dans .NET, le modèle serait:

 Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)<*>quot;)

Le " ^ " correspond au début de la chaîne, le signe "$" correspond à la fin, il recherche donc une correspondance exacte pour l'un de ces mots. Je suis un peu flou sur la syntaxe PHP correspondante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top