正規表現 - 混合文字とマッチ(のみ)の単語
質問
私は私のアンチスパム/ badworsフィルタを書いているし、可能であれば私が必要とする、
(検出)のような混合文字によって形成された唯一の言葉を一致させる:FR1&ND $なく友人
正規表現でこれが可能である!?
よろしく!
解決
もちろん、それは正規表現で可能です!あなたは、ネストされた括弧に一致するように求めていません! :P
しかし、はい、これは正規表現をするために建設されたものの一種です。例:
/\S*[^\w\s]+\S*/
これは、次のすべてに一致します
@ss
as$
a$s
@$s
a$$
@s$
@$$
これはのないのこれを一致させます
ass
私はあなたが望むものであると信じてどの。仕組み:
\S*
は0以上の非空白文字に一致します。 [^\w\s]+
は(そのシンボルキャラクタが必要です。)(それは単語またはスペースでないものにマッチします)のみのシンボルと一致し、そのうちの1以上に一致しその後\S*
は再び(0以上の非空白文字にマッチします記号や文字)。
あなたは変数に正規表現を格納することができます。あなたが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);