Regex - karışık karakter ile Maç (sadece) kelimeler

4 Cevap php

, Benim anti-spam / badwors filtresi yazıyorum ve mümkünse i need

fr1 & nd $ değil arkadaşlar: (algılama) gibi sadece karışık karakterler tarafından oluşturulan sözcükleri eşleştirmek

Bu regex ile mümkün!?

saygılarımla!

4 Cevap

Tabii ki regex mümkün! Sen iç içe parantez maç soran değil! : P

Ama evet, bu şey düzenli ifadelerin tür için inşa edilmiş olduğunu. Örnek:

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

Bu aşağıdaki tüm maç olacak:

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

Bu not Bu maç olacak:

ass

Hangi Ben ne istediğiniz olduğuna inanıyorum. Nasıl çalışır:

\S*, 0 veya daha fazla non-boşluk karakterleri ile eşleşir. [^\w\s]+, sadece sembolleri (bir sözcük ya da bir alan değildir şey maç olacak) maçları, ve 1 veya daha fazla onları maçları (yani bir sembol karakter gereklidir.) Ardından {[(0) }] yine 0 veya daha fazla non-boşluk karakterleri (semboller ve harfler) eşleşir.

Ben daha iyi bir strateji önermek için izin verilebilir ise, Perl bir değişken bir regex saklayabilirsiniz. PHP bunu eğer ben bilmiyorum, ama eğer, bu tür gibi değişkenlerin bir listesini oluşturabiliriz:

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

Veya:

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

Yani bu şekilde, sizinle tüm permütasyon "arkadaş" eşleşebilir:

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

Veya:

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

Verilen, ikincisi gereksiz ayrıntılı görünüyor, ama o sizin için PHP bulunuyor. Ben oldukça ayrı değişkenler gibi her yerine, bir karma hepsini saklar beri ikinci, muhtemelen en iyi çözüm olduğunu düşünüyorum, ama üreten regex biraz çirkin olduğunu itiraf.

Bu mümkündür, çok güzel regex kurallara sahip değil, ancak temelde regex kullanarak tarif edebilir herhangi bir desen maç olabilir. Zor kısmı onu anlatıyor.

Ben bunu böyle kötü kelimeleri tespit etmek için regex kurallar bir grup var olacağını tahmin ediyorum:

FR1 & nd $, arkadaşlar fr * algılamak için nd Senin gibi bir regex kullanabilirsiniz:

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

Her kural için böyle bir şey yaptığını parantez içinde olası tüm karakterleri çeşitlerini bulabilirsiniz. Daha fazla bilgi için bir regex rehber pick up.

(Bir Badwords isteyeyim friend gibi frie**, sen kötü bir kelime yanı sıra olası tüm permütasyon gizlemek isteyebilirsiniz filtrelemek için varsayarak kulüpler)

İyice bu test etmedi, ama bunu yapmak gerekir:

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

Aşağıdaki gibi bazı normal ifadeler inşa olabilir:

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

Bu, bir veya daha fazla harf, bir veya daha fazla rakam veya semboller ([\d\p{S}]+) ve ardından gelen boşluk olmayan (\p{L}+, Unicode character preferences bakınız) herhangi bir sırada eşleşir karakter \S*.

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);