Pregunta

Estoy escribiendo mi anti-spam filtro / badwors y necesito si es posible,

para que coincida (detectar) sólo palabras formadas por caracteres mixtos como: FR1 y nd $ y no amigos

es esto posible con expresiones regulares!?

saludo!

¿Fue útil?

Solución

Por supuesto que es posible con expresiones regulares! No se está pidiendo para que coincida con paréntesis anidados! : P

Pero sí, este es el tipo de expresiones regulares cosa fueron construidos. Un ejemplo:

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

Esto corresponderá con todo lo siguiente:

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

Será no que coincida con lo siguiente:

ass

que creo que es lo que desea. Cómo funciona:

\S* partidos 0 o más caracteres no espaciales. [^\w\s]+ coincide sólo con los símbolos (que coincidirá con nada que no sea una palabra o un espacio), y coincide con 1 o más de ellos (por lo que se requiere un carácter de símbolo.) A continuación, el nuevo <=> 0 o más de no caracteres -Espacio (símbolos y letras).

Si se me permite sugerir una mejor estrategia, en Perl que puede almacenar una expresión regular en una variable. No sé si se puede hacer esto en PHP, pero si se puede, se puede construir una lista de variables tales como:

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

O:

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

Así que de esa manera, puede hacer coincidir "amigo" en todas sus permutaciones con:

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

O:

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

Por supuesto, el segundo se ve innecesariamente prolijo, pero eso es PHP para usted. Creo que el segundo es probablemente la mejor solución, ya que todos ellos almacena en un hash, en lugar de todas las variables como independientes, pero tengo que admitir que la expresión regular que produce es un poco feo.

Otros consejos

Es posible, que no tendrá reglas de expresiones regulares muy bonito, pero puede hacer coincidir básicamente cualquier patrón que se puede describir usando expresiones regulares. La parte difícil está describiendo a él.

Me imagino que tendría un montón de reglas de expresiones regulares para detectar malas palabras, así:

Para detectar FR1 y nd $, amigos, fr ** nd * puede utilizar una expresión regular como:

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

Hacer algo como esto para cada regla encontrarán todas las variaciones posibles de caracteres en los soportes. Recoger una guía de expresiones regulares para obtener más información.

(estoy asumiendo durante badwords filtro que desee friend, así como frie**, es posible que desee enmascarar la mala palabra, así como todas las permutaciones posibles)

¿No prueba esto a fondo, pero esto debe hacerlo:

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

Se puede construir algunas expresiones regulares como la siguiente:

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

Esta coincidirá con cualquier secuencia de una o más letras (\p{L}+, ver preferencias de caracteres Unicode ), uno o más dígitos o símbolos ([\d\p{S}]+) y cualquier siguientes caracteres no está en blanco \S*.

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top