Pergunta

eu estou escrevendo minha anti spam / filtro badwors e eu preciso, se é possível,

para corresponder (detectar) apenas palavras formadas por caracteres mistos como: FR1 & nd $ e não amigos

Isso é possível com regex!?

melhores cumprimentos!

Foi útil?

Solução

É claro que é possível com regex! Você não está pedindo para corresponder parênteses aninhados! : P

Mas sim, este é o tipo de coisa que as expressões regulares foram construídos para. Um exemplo:

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

Isso irá corresponder a todos os seguintes:

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

Ele irá não coincidir com o seguinte:

ass

O que eu acredito é o que você quer. Como funciona:

\S* casa 0 ou mais não-espaciais caracteres. Jogos [^\w\s]+ apenas os símbolos (ele irá corresponder qualquer coisa que não é uma palavra ou um espaço), e coincide com um ou mais deles (assim um personagem símbolo é necessária.) Então o \S* novamente corresponde a 0 ou mais não-espaço caracteres ( símbolos e letras).

Se me permitem sugerir uma estratégia melhor, em Perl você pode armazenar um regex em uma variável. Eu não sei se você pode fazer isso em PHP, mas se você pode, você pode construir uma lista de variáveis ??como tal:

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

Ou:

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

Então, dessa forma, você pode combinar "amigo" em todas as suas permutações com:

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

Ou:

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

Com certeza, o segundo um aspecto desnecessariamente detalhada, mas isso é PHP para você. Eu acho que o segundo é provavelmente a melhor solução, uma vez que ele armazena-los todos em um hash, ao invés de todos como variáveis ??separadas, mas eu admito que a regex que produz é um pouco feio.

Outras dicas

É possível, você não terá regras muito bonitas regex, mas você pode combinar basicamente qualquer padrão que você pode descrever usando regex. A parte difícil é descrevê-lo.

Eu acho que você teria um monte de regras regex para detectar más palavras assim:

Para detectar FR1 & nd $, amigos, fr ** nd * você pode usar uma regex como:

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

Fazer algo como este para cada regra vai encontrar todas as variações de possíveis caracteres nos suportes. Pegar um guia regex para mais informações.

(estou assumindo para um filtro badwords você gostaria friend, bem como frie**, você pode querer mascarar a má palavra, bem como todas as permutações possíveis)

Não testar isso completamente, mas isso deve fazê-lo:

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

Você poderia construir algumas expressões regulares, como o seguinte:

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

Isso irá corresponder a qualquer sequência de uma ou mais letras (\p{L}+, consulte preferências de caracteres Unicode ), um ou mais dígitos ou símbolos ([\d\p{S}]+) e qualquer seguinte caracteres não-espaço em branco \S*.

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top