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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top