trova la ricorrenza di un insieme di parole
-
22-07-2019 - |
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.
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.