Domanda

Ho un modello con un piccolo elenco di parole illegali da usare come soprannomi impostati in una variabile del modello come questa:

$pattern = webmaster|admin|webadmin|sysadmin

Usando preg_match , come posso ottenere in modo che i nickname con queste parole siano proibiti, ma registrando qualcosa come " admin2 " o " thesysadmin " è consentito?

Questa è l'espressione che ho finora:

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

// Non dovrebbe essere consentito

Nota: l'utilizzo di un \ b non è stato di grande aiuto.

È stato utile?

Soluzione

Che dire di non usare affatto regex?
E lavorare con explode e in_array ?

Ad esempio, ciò farebbe:

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

Esplode il tuo pattern in un array, usando | come separatore.


E questo:

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

ti porterà

admin is not OK

Considerando che questo (stesso codice; cambia solo la parola) :

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

ti porterà

admin2 is OK

In questo modo, non c'è bisogno di preoccuparsi di trovare la giusta regex, per abbinare parole piene: corrisponderà solo a parole esatte ;-)


Modifica: un problema potrebbe essere che il confronto sarà sensibile al maiuscolo / minuscolo :-(
Lavorare con tutto in minuscolo aiuterà a questo:

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

Ti porterà:

aDMin is not OK

(ho visto il flag ' i ' nella regex solo dopo aver pubblicato la mia risposta; quindi, ho dovuto modificarlo)


Modifica 2: e, se vuoi davvero farlo con una regex, devi sapere che:

  • ^ segna l'inizio della stringa
  • e $ segna la fine della stringa

Quindi, qualcosa del genere dovrebbe fare:

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

Le parentesi probabilmente non sono necessarie, ma mi piace usarle per isolare ciò che volevo.

E otterrai lo stesso tipo di output:

admin is not OK

admin2 is OK

Probabilmente non vuoi usare [ e ] : significano " qualsiasi carattere tra noi " ;, e non " l'intera stringa che è tra di noi " ;.

E, come riferimento: manuale della preg sintassi ;-)

Altri suggerimenti

Quindi, le parole proibite possono essere parte del loro nome utente ma non il tutto?

In .NET, il modello sarebbe:

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

Il " ^ " corrisponde all'inizio della stringa, il " $ " corrisponde alla fine, quindi sta cercando una corrispondenza esatta su una di quelle parole. Sono un po 'confuso sulla sintassi PHP corrispondente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top