2009-05-10 14 views

Antwort

6

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

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

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

Es wird nicht Spiel dies:

ass 

Was ich glaube, ist, was Sie wollen

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

Dies wird mit allen folgenden entsprechen. Wie es funktioniert:

\S* entspricht 0 oder mehr Leerzeichen. [^\w\s]+ stimmt nur mit den Symbolen überein (entspricht allem, was kein Wort oder Leerzeichen ist) und stimmt mit einem oder mehreren von ihnen überein (ein Symbolzeichen ist also erforderlich). Dann entspricht \S* wieder 0 oder mehr Leerzeichen (Symbole und Buchstaben).

Wenn ich eine bessere Strategie vorschlagen kann, können Sie in Perl eine Regex in einer Variablen speichern.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 = /[[email protected]]/ # regex that matches all a-like symbols 
$b = /[bB]/ 
$c = /[cC(]/ 
# etc... 

Oder:

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

So Auf diese Weise können Sie match "Freund" in all seinen Permutationen mit:

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

Oder:

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

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

+0

Super Regex + Erklärung +1! Btw, Regex in PHP ist in Strings gespeichert, so dass variable Permutationen wie Sie vorschlagen, sicherlich möglich ist. –

+0

Eigentlich könnte es interessant sein, das in eine Funktion zu schreiben. Übergeben Sie ein normales Wort und es würde mit der richtigen Regex antworten, um dieses Wort zu erkennen. Das einzige Problem, das ich sehen konnte, ist etwas wie W = \/\/oder irgend ein Multi-Zeichen. –

+0

W =! (?: [WW] | \\/\\ /)! (in meiner Muttersprache Perl). Es wäre schwieriger für Dinge wie W mit Multi-Charakter-Matches, aber sicherlich möglich. Eine Funktion könnte einfach geschrieben werden, die Zeichen für Zeichen durchläuft und eine Regex nachstellt, die zu diesem Zeichen passt, und sie dann zu einem riesigen (schrecklich aussehenden) Regex zusammenfügt, mit dem Sie diese abgleichen können Wort. Allerdings verwende ich PHP nicht oft genug, um es zu tun. Ich könnte es in Perl tun, wenn die Laune mich trifft. Oder was auch immer dieser Ausdruck sein soll. –

0

Sie könnten einige reguläre Ausdrücke wie die bauen folgende:

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

Dies wird jede Folge von einem oder mehreren Buchstaben entsprechen (\p{L}+ siehe Unicode character preferences), eine oder mehrere Ziffern oder Symbole ([\d\p{S}]+) und alle folgenden Nicht-Leerzeichen Zeichen \S*.

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

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 ist es zu beschreiben.

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

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

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

Wenn Sie so etwas für jede Regel ausführen, finden Sie alle Variationen möglicher Zeichen in den Klammern. Holen Sie sich einen Regex-Guide für weitere Informationen.

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

+0

ich langweilig wurde und dies in Perl einmal. Die Regexes sehen ziemlich abscheulich aus, besonders wenn Sie versuchen, Rechtschreibfehler zu berücksichtigen. –

0

Hat dieser nicht gründlich testen, aber das sollte es tun:

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

Dies entspricht "a" (Wort gefolgt von Leerzeichen). –

+0

Meine schlechte :) Ich habe es geändert, sollte der zusätzliche Platz es tun. –

+0

Ich würde auch für Tabs gehen, aber das sollte funktionieren. –