データベースに悪口の辞書があり、次のようにするとうまくいきます
preg_match_all("/\b".$f."(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
$tは入力テキストで、単純に$f = preg_quote("punk"); "punk"はデータベース ディクショナリからのものであるため、ループのこの時点での式は次のようになります。
preg_match_all("/\bpunk(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
preg_quoteシンボルを置き換えます。#式がエスケープさ\\#れるようにしますが、辞書がチェックしている場合など。"F@CK"または、これらの記号は上記の式の入力文字列で検出されません。辞書にはとの"A$$"両方がありますが、機能しません。単語を削除すると、これらの記号はエスケープされないため、正規表現は無効になります。a$$f@ckpreg_quote()
検出方法に関する提案はあります"a$$"か???
編集:
したがって、意図したとおりに機能しない表現は、たとえば.
preg_match_all("/\bf\@ck(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
f@ckを見つけるべきもの$t
アップデート:
これは私の使い方です。$mreplace them withに一致するものがあれば"\*\*\*\*"、このブロック全体が辞書内の各単語のループ内にあり、$fが辞書の単語で$tあり、 が入力です
$f = preg_quote($f);
preg_match_all("/\b$f(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
if (count($m) > 0) {
$t = preg_replace("/(\b$f(?:ing|er|es|s)?\b)/si","\*\*\*\*\*",$t);
}
更新:見よ、var_dump:
preg_quote($f) = string(5) "a\$\$"
$t = string(18) "You're such an a$$"
expression = string(29) "/\ba\$\$(?:ing|er|es|s)?\b/si"
更新: これは、単語が記号で終わる場合にのみ発生します。テスト"a$$hole"しましたが、問題ありませんが、"a$$"機能しません。
別の更新: この簡略化され$wordsたバージョンをお試しください。その場しのぎの辞書です
$words = array("a$$","asshole","a$$hole","f@ck","f#ck","f*ck");
$text = "Input whatever you feel like here eg. a$$";
foreach ($words as $f) {
$f = preg_quote($f,"/");
$text = preg_replace("/\b".$f."(?:ing|er|es|s)?\b/si",
str_repeat("*",strlen($f)),
$t);
}
私は結果として見ることを期待する必要が"Input whatever you feel like here eg. \*\*\*"あります。