質問

私は私のアンチスパム/ badworsフィルタを書いているし、可能であれば私が必要とする、

(検出)のような混合文字によって形成された唯一の言葉を一致させる:FR1&ND $なく友人

正規表現でこれが可能である!?

よろしく!

役に立ちましたか?

解決

もちろん、それは正規表現で可能です!あなたは、ネストされた括弧に一致するように求めていません! :P

しかし、はい、これは正規表現をするために建設されたものの一種です。例:

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

これは、次のすべてに一致します

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

これはのないのこれを一致させます

ass

私はあなたが望むものであると信じてどの。仕組み:

\S*は0以上の非空白文字に一致します。 [^\w\s]+は(そのシンボルキャラクタが必要です。)(それは単語またはスペースでないものにマッチします)のみのシンボルと一致し、そのうちの1以上に一致しその後\S*は再び(0以上の非空白文字にマッチします記号や文字)。

私はPerlで、より良い戦略を提案できるようにしてもよい場合は、

あなたは変数に正規表現を格納することができます。あなたがPHPでこれを行うことができるかどうかは分かりませんが、あなたができるならば、あなたは、このようなような変数のリストを構築することができます:

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

それともます:

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

だから、その方法は、あなたがそのすべての順列に「友人」を一致させることができます

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

それともます:

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

確かに、もう一つは不必要に冗長に見えますが、それはあなたのためのPHPです。私はそれはむしろ、すべてのように別々の変数よりも、ハッシュでそれらのすべてを保存するため、二つ目は、おそらく最良の解決策だと思うが、私はそれが生成する正規表現は少し醜いがあると認めるます。

他のヒント

それは可能です、あなたは非常にきれいな正規表現のルールを持っていませんが、基本的には正規表現を使って記述することができます任意のパターンを一致させることができます。トリッキーな部分は、それを記述している。

私はあなたがそうのような悪い言葉を検出するために、正規表現のルールの束を持っているであろうと推測ます:

FR1&ND $を検出するために、友人、FR ** ND *あなたのような正規表現を使用することができます

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

各ルールのため、このような何かを行うことは、括弧内に可能な文字のすべてのバリエーションがあります。詳細は正規表現のガイドをピックアップます。

(私はあなたが悪い言葉だけでなく、すべての可能な順列をマスクすることが、あなたはfriendなどfrie**を望むBADWORDSフィルタ用と仮定しています)。

徹底的にこれをテストしていないが、これはそれを行う必要があります:

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

あなたは、次のようないくつかの正規表現を構築することができます:

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

これは1文字以上の任意のシーケンスにマッチします(\p{L}+、参照<のhref = "http://docs.php.net/manual/regexp.reference.php#regexp.reference.unicode" のrel = "nofollowをnoreferrer "> Unicode文字の好みを)、一つ以上の数字または記号([\d\p{S}]+)と任意の以下の非空白文字が\S*ます。

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top