Frage

Ich schreibe meine Anti-Spam / badwors Filter und ich brauche, wenn möglich,

übereinstimmen (detect) nur durch gemischte Zeichen gebildet Worte wie: fr1 & nd $ und nicht Freunde

ist dies möglich mit regex!?

Mit freundlichen Grüßen!

War es hilfreich?

Lösung

Natürlich ist es möglich, mit regex! Sie fragen nicht verschachtelt Klammern entsprechen! : P

Aber ja, das ist die Art von Dingen, regulärer Ausdrücke wurden gebaut. Ein Beispiel:

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

Dies wird mit allen folgenden entsprechen:

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

Es nicht passen diese:

ass

Was ich glaube, ist, was Sie wollen. Wie es funktioniert:

\S* entspricht 0 oder mehr Nicht-Leerzeichen. [^\w\s]+ paßt nur die Symbole (es wird alles akzeptiert, die nicht ein Wort oder ein Raum), und entspricht 1 oder mehr von ihnen (so ein Symbolzeichen erforderlich ist.) Dann wieder die \S* entspricht 0 oder mehr Nicht-Leerzeichen ( Symbole und Buchstaben).

Wenn ich erlaubt werden kann, eine bessere Strategie vorzuschlagen, in Perl Sie einen regulären Ausdruck in einer Variablen speichern können. Ich weiß nicht, ob Sie dies in PHP tun, aber wenn Sie können, können Sie eine Liste von Variablen, wie so konstruieren:

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

Oder:

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

So diese Weise können Sie mit in allen seinen Permutationen „Freund“ entsprechen:

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

Oder:

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

Zugegeben, sieht die zweite unnötig ausführlich, aber das ist PHP für Sie. Ich denke, die zweite ist wahrscheinlich die beste Lösung, da er sie alle in einem Hash gespeichert werden, anstatt alle als separate Variablen, aber ich gebe zu, dass die Regex es erzeugt ein bisschen hässlich ist.

Andere Tipps

Es ist möglich, Sie werden nicht sehr hübsch regex Regeln haben, aber Sie können grundsätzlich jedes Muster übereinstimmen, die Sie mit regex beschreiben kann. Der schwierige Teil beschreibt es.

Ich würde vermuten, dass Sie eine Reihe von regex Regeln hätten schlechte Worte zu erkennen, etwa so:

Zur Erkennung fr1 & nd $, Freunde, fr ** nd * Sie einen regulären Ausdruck wie verwenden können:

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

Doing so etwas wie dies für jede Regel werden alle Varianten der möglichen Zeichen in den Klammern finden. Pick-up einen regex Guide für weitere Informationen.

(I für einen badwords Filter nehme an, Sie friend sowie frie** wollen würde, können Sie das schlechte Wort sowie alle möglichen Permutationen maskieren möchten)

Haben diese nicht gründlich testen, aber das sollte es tun:

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

Sie könnten einige reguläre Ausdrücke wie den folgenden Aufbau:

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

Dies wird jede Folge von einem oder mehreren Buchstaben entspricht (\p{L}+ finden Sie unter Unicode-Zeicheneinstellungen ), eine oder mehrere Ziffern oder Symbole ([\d\p{S}]+) und alle folgenden, nicht Leerzeichen \S*.

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top