Domanda

sto scrivendo il mio filtro anti-spam / badwors e ho bisogno, se è possibile,

per abbinare (rilevare) solo parole formate da caratteri contrastanti come: FR1 & nd $ e non amici

è possibile questo con regex!?

Con i migliori saluti!

È stato utile?

Soluzione

Naturalmente è possibile con espressioni regolari! Non stai chiedendo di abbinare parentesi annidati! : P

Ma sì, questo è il tipo di cosa che le espressioni regolari sono stati costruiti per. Un esempio:

/\S*[^\w\s]+\S*/

In questo modo hanno tutte le seguenti:

@ss
as$
a$s
@$s
a$$
@s$
@$$

Si non corrispondere a questo:

ass

che credo sia quello che vuoi. Come funziona:

\S* partite 0 o più caratteri non spaziali. [^\w\s]+ corrisponde solo i simboli (che corrisponderanno tutto ciò che non è una parola o uno spazio), e corrisponde 1 o più di essi (quindi è necessario un carattere di simbolo.) Poi il <=> corrisponde ancora 0 o più non caratteri -Spazio (simboli e lettere).

Se mi è permesso di suggerire una strategia migliore, in Perl è possibile memorizzare una regex in una variabile. Non so se si può fare questo in PHP, ma se è possibile, è possibile costruire un elenco di variabili come ad esempio:

$a = /[aA@]/ # regex that matches all a-like symbols
$b = /[bB]/
$c = /[cC(]/
# etc...

o

$regex = array( 'a' => /[aA@]/, 'b' => /[bB]/, 'c' => /[cC(]/, ... );

Quindi in questo modo, è possibile abbinare "amico" in tutte le sue permutazioni con:

/$f$r$i$e$n$d/

o

/$regex['f']$regex['r']$regex['i']$regex['e']$regex['n']$regex['d']/

Certo, il secondo sembra inutilmente prolisso, ma questo è il PHP per voi. Credo che la seconda è probabilmente la soluzione migliore, dal momento che li memorizza in un hash, piuttosto che tutte le variabili come elementi separati, ma ammetto che l'espressione regolare che produce è un po 'brutto.

Altri suggerimenti

E 'possibile, non si avrà regole regex molto carina, ma si può abbinare praticamente qualsiasi modello che si può descrivere tramite espressioni regolari. La parte difficile sta descrivendo esso.

Direi che si avrebbe un sacco di regole regex per rilevare le parolacce in questo modo:

Per rilevare FR1 & nd $, gli amici, fr ** nd * è possibile utilizzare una regex come:

/fr[1iI*][&eE]nd[s$Sz]/

fare qualcosa di simile per ogni regola troverà tutte le varianti di caratteri possibili tra parentesi. Prendete una guida regex per maggiori informazioni.

(sto assumendo per un BADWORDS filtrare si vorrebbe friend così come frie**, si consiglia di mascherare la parola cattivo così come tutte le possibili permutazioni)

Non provare questo a fondo, ma questo dovrebbe farlo:

(\w+)*(?<=[^A-Za-z ])

Si potrebbe costruire alcune espressioni regolari come il seguente:

\p{L}+[\d\p{S}]+\S*

Questa corrisponderà a qualsiasi sequenza di uno o più lettere (\p{L}+, vedere preferenze di caratteri Unicode ), una o più cifre o simboli ([\d\p{S}]+) ed eventuali seguenti caratteri non di spaziatura \S*.

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top