スパム対策/悪意のあるフィルターを作成していますが、可能であれば必要です。
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']/
確かに、2 番目のものは不必要に冗長に見えますが、それが PHP です。2 番目の方法がおそらく最良の解決策だと思います。これは、すべてを個別の変数として保存するのではなく、すべてをハッシュに保存するためですが、生成される正規表現が少し見苦しいことは認めます。
これを徹底的にテストしませんでしたが、これでうまくいくはずです:
(\w+)*(?<=[^A-Za-z ])
次のような正規表現を作成できます。
\p{L}+[\d\p{S}]+\S*
\p{L}+
これは、1 つまたは複数の文字 ( 、Unicode 文字の設定を参照)、1 つまたは複数の数字または記号 ( [\d\p{S}]+
)、および後続の空白以外の文字の任意のシーケンスと一致します\S*
。
$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);
あまりきれいな正規表現ルールがない可能性もありますが、基本的に、正規表現を使用して記述できるすべてのパターンに一致させることができます。トリッキーな部分はそれを説明することです。
次のような悪い言葉を検出するための正規表現ルールがたくさんあると思います。
fr1&nd$、friends、fr**nd* を検出するには、次のような正規表現を使用できます。
/fr[1iI*][&eE]nd[s$Sz]/
各ルールに対してこのようなことを行うと、括弧内の可能な文字のすべてのバリエーションが見つかります。詳細については、正規表現ガイドを入手してください。
(私は、あなたが望む悪い言葉フィルターとfriend
同様にfrie**
、悪い言葉とすべての可能な順列をマスクしたいと思うかもしれません)