Question

J'écris mon filtre anti-spam / badwors et j'ai besoin s'il est possible,

pour correspondre (détecter) que des mots formés par des caractères mixtes comme: FR1 & e $ et d'amis

est-ce possible avec regex!

meilleures salutations!

Était-ce utile?

La solution

Bien sûr, il est possible avec regex! Vous n'êtes pas à établir une correspondance entre parenthèses imbriquées! : P

Mais oui, c'est le genre de chose que les expressions régulières ont été construites pour. Un exemple:

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

correspondra à tous les éléments suivants:

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

Il pas correspond à ceci:

ass

Ce que je crois est ce que vous voulez. Comment ça marche:

\S* correspond à 0 ou plusieurs caractères non-espace. Correspond uniquement au [^\w\s]+ symboles (il correspondra à tout ce qui est pas un mot ou un espace), et correspond à 1 ou plusieurs d'entre eux (donc un caractère de symbole est nécessaire.) Puis le nouveau 0 correspond à <=> ou non plus caractères -Espace (symboles et lettres).

Si je peux me permettre de proposer une meilleure stratégie, en Perl, vous pouvez stocker une expression régulière dans une variable. Je ne sais pas si vous pouvez le faire en PHP, mais si vous le pouvez, vous pouvez construire une liste de variables comme par exemple:

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

Ou:

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

De cette façon, vous pouvez correspondre à « ami » dans toutes ses permutations avec:

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

Ou:

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

Certes, le second semble inutilement bavard, mais c'est PHP pour vous. Je pense que le deuxième est probablement la meilleure solution, car il les stocke dans un hachage, plutôt que toutes les variables séparées, mais je reconnais que le regex qu'il produit est un peu laid.

Autres conseils

Il est possible, vous ne serez pas avoir des règles regex très jolies, mais vous pouvez faire correspondre essentiellement tout motif que vous pouvez décrire à l'aide regex. La partie la plus délicate est le décrire.

Je suppose que vous auriez un tas de règles regex pour détecter les mauvais mots comme ceci:

Pour détecter FR1 & e $, amis, fr ** e * vous pouvez utiliser une expression régulière comme:

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

Faire quelque chose comme ça pour chaque règle trouveront toutes les variantes de caractères possibles dans les supports. Procurez-vous un guide regex pour plus d'informations.

(je suppose que pour un badwords filtre que vous voulez ainsi que friend frie**, vous pouvez masquer le mauvais mot, ainsi que toutes les permutations possibles)

n'a pas testé ce bien, mais cela ne devrait le faire:

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

Vous pouvez construire des expressions régulières comme suit:

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

correspondra à une séquence d'une ou plusieurs lettres (\p{L}+, voir préférences de caractères Unicode ), un ou plusieurs chiffres ou des symboles ([\d\p{S}]+) et des caractères non-blancs suivants \S*.

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top