encontrar la aparición de un conjunto de palabras
-
22-07-2019 - |
Pregunta
Tengo un patrón con una pequeña lista de palabras que son ilegales para usar como apodos establecidos en una variable de patrón como esta:
$pattern = webmaster|admin|webadmin|sysadmin
Usando preg_match
, ¿cómo puedo lograr que los apodos con estas palabras estén prohibidos, pero registrando algo como " admin2
" o " thesysadmin
" está permitido?
Esta es la expresión que tengo hasta ahora:
preg_match('/^['.$pattern.']/i','admin');
// No debe permitirse
Nota: Usar un \ b
no ayudó mucho.
Solución
¿Qué pasa con no usar regex en absoluto?
Y trabajando con explde
y in_array
?
Por ejemplo, esto haría:
$pattern = 'webmaster|admin|webadmin|sysadmin';
$forbidden_words = explode('|', $pattern);
Explota su patrón en una matriz, usando | como separador.
Y esto:
$word = 'admin';
if (in_array($word, $forbidden_words)) {
echo "<p>$word is not OK</p>";
} else {
echo "<p>$word is OK</p>";
}
te atrapará
admin is not OK
Mientras que este (mismo código; solo cambia la palabra) :
$word = 'admin2';
if (in_array($word, $forbidden_words)) {
echo "<p>$word is not OK</p>";
} else {
echo "<p>$word is OK</p>";
}
te atrapará
admin2 is OK
De esta manera, no necesita preocuparse por encontrar la expresión regular correcta, para que coincida con palabras completas: solo coincidirá con palabras exactas ;-)
Editar: un problema podría ser que la comparación distingue entre mayúsculas y minúsculas :-(
Trabajar con todo en minúsculas ayudará con eso:
$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>";
}
Te conseguirá:
aDMin is not OK
(Vi la bandera ' i
' en la expresión regular solo después de publicar mi respuesta; por lo tanto, tuve que editarla)
Editar 2: y, si realmente quieres hacerlo con una expresión regular, debes saber que:
-
^
marca el comienzo de la cadena - y
$
marcan el final de la cadena
Entonces, algo como esto debería hacer:
$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>";
}
Los paréntesis probablemente no sean necesarios, pero me gusta usarlos para aislar lo que quería.
Y obtendrá el mismo tipo de salida:
admin is not OK
admin2 is OK
Probablemente no desee utilizar [
y ]
: significan "cualquier carácter que esté entre nosotros" y no "toda la cadena que es entre nosotros " ;.
Y, como referencia: manual de la sintaxis preg ;-)
Otros consejos
Entonces, ¿las palabras prohibidas pueden ser parte de su nombre de usuario pero no todo?
En .NET, el patrón sería:
Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)<*>quot;)
El " ^ " coincide con el comienzo de la cadena, el " $ " coincide con el final, por lo que busca una coincidencia exacta en una de esas palabras. Estoy un poco confuso con la sintaxis PHP correspondiente.