trouver l'occurrence d'un ensemble de mots
-
22-07-2019 - |
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é.
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.