36

データベースに悪口の辞書があり、次のようにするとうまくいきます

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. \*\*\*"あります。

4

3 に答える 3

188

できない

申し訳ありませんが、この「問題」は解決不可能です。これらを考慮してください:

  • ꜰᴜᴄᴋ is U+A730.1D1C.1D04.1D0B, "\N{ラテン文字小文字F}\N{ラテン文字小文字U}\N{ラテン文字小文字C}\N{ラテン文字小文字K}"
  • ᶠᵘᶜᵏ is U+1DA0.1D58.1D9C.1D4F, "\N{MODIFIER LETTER SMALL F}\N{MODIFIER LETTER SMALL U}\N{MODIFIER LETTER SMALL C}\N{MODIFIER LETTER SMALL K}"
  •   は U+1D4BB.1D4CA.1D4B8.1D4C0 であり、"\N{数学スクリプト 小文字 F}\N{数学スクリプト 小文字 U}\N{数学スクリプト 小文字 C}\N{数学スクリプト 小文字 K}"
  •   は U+1D58B.1D59A.1D588.1D590 です。
  •   は U+1D4D5.1D4B0.1D49E.1D4A6 です。
  • ⓕ ⓤ ⓒ ⓚ is U+24D5.24E4.24D2.24DA, "\N{丸付きラテン小文字 F}\N{丸付きラテン小文字 U}\N{丸付きラテン小文字 C}\N{丸付きラテン小文字K}"
  • Γ̵ᏟᏦ は U+393.335.10335.13DF.13E6、「\N{ギリシャ大文字 GAMMA}\N{ショート ストローク オーバーレイの結合}\N{ゴシック文字 QAIRTHRA}\N{チェロキー文字 TLI}\N{チェロキー文字 TSO}"
  • ƒμɕѤ は U+192.3BC.255.464、「\N{LATIN SMALL LETTER F WITH HOOK}\N{GREEK SMALL LETTER MU}\N{LATIN SMALL LETTER C WITH CURL}\N{キリル大文字 IOTIFIED E}"
  • Г̵ЦСК は U+413.335.426.421.41A、"\N{キリル大文字 GHE}\N{ショート ストローク オーバーレイの結合}\N{キリル大文字 TSE}\N{キリル大文字 ES}\N{キリル大文字 KA }"
  • æᵾȼƙ is U+493.1D7E.23C.199, "\N{キリル小文字 GHE ストロークあり}\N{ラテン語小文字 U ストロークあり}\N{ラテン小文字 C ストロークあり}\N{ラテン小文字 Kフック付き}」
  • ϜυϚΚ は U+3DC.3C5.3DA.39A、「\N{ギリシャ文字ディガマ}\N{ギリシャ小文字ウプシロン}\N{ギリシャ文字スティグマ}\N{ギリシャ大文字カッパ}」
  • ЖↃUᆿ は U+416.2183.55.11BF、「\N{キリル文字の大文字 ZHE}\N{ローマ数字の 100 を逆にした}\N{ラテン文字の大文字の U}\N{HANGUL JONGSEONG KHIEUKH}"
  • ʞɔnɟ は U+29E.254.6E.25F です。

ひどくなる

そして、それらが簡単だと思う場合は、これらすべてに対処してみてください。

 00 Ↄ ʞ, F ᵾ ⒞ K, K ⓒ Ц ⒡ , K , æ ∞ Ϛ k, f Ꮯ K, ⓕ oo ɔ ⓚ , ɟ ⒰ ¢ K, ȼ , Ù ⒦ , f ⒞ ƙ, Fᶜ , F ∞ Ж , @ Ꮯ , ɟ ᵘ , F Ц ¢ , f oo Ꮯ ʞ, oo ¢ Ж , υ Κ , Ϝ ú * ʞ, ꜰ c K, ƒ ᵘ ȼ k, U ȼ , Ж ɔ μ ƒ, F ⓤ ⒞ k, ƒ C ƙ, ړ 00 ɔ Ѥ, ƒ U c ᴋ, ∞ Ꮶ ⓒ , ꜰ ᴄ ⒦ , ⒰ Ꮯ Ѥ, ꜰ ᴜ ⒦ , F ʞ, f 00 , ړ u С K, f ɔ Κ , f μ Ↄ K, ɟ c ʞ, f Ↄ , F μ ¢ , ᆿ ᴄ ⒦ , Κ ¢ oo ɟ, ᶠ μ ᶜ Ѥ, ᶠ ⓤ Ꮯ Ж , ⒞ ᵘ F, F @ C ⓚ , Ѥ ᴄ u F, ⒡ ᵾ C k , ƒ μ ᶜ ᴋ, F C , f ᵘ ¢ ᵏ, ᆿ 00 , ꜰ υ κ, Ϝ ş К , oo ɕ ᴋ, ړ Ꮯ ᴋ, ꜰ n K, ꜰ μ Ϛ , F ∞ ȼ , ⒡ Ↄ Κ , ƒ ⒞ , ᶠ U C Ꮶ, ᶠ υ Ↄ ƙ, C , Ϝ U Ѥ, Ϝ U Ↄ , U ⒞ ᵏ, F @ C К , ᴜ ᴋ, ⒡ U , ɟ U * ᵏ, Ц c Κ ,

于 2011-05-23T15:46:30.740 に答える
4

\b単語境界をチェックします。http://www.regular-expressions.info/wordboundaries.htmlによると:

単語境界とみなされる位置は 3 つあります。

  • 文字列の最初の文字の前 (最初の文字が単語文字の場合)。
  • 最後の文字が単語文字の場合、文字列の最後の文字の後。
  • 文字列内の 2 つの文字の間。1 つは単語の文字で、もう 1 つは単語の文字ではありません。

「単語文字」は文字、数字、およびアンダースコアであるため、文字列「a$$」では、単語境界は 2 番目の「$」の後ではなく、「a」の後に発生します。

クラスを使用して、「単語境界」と見なす文字を明示的に指定する必要がある場合があります (例: [- '"])。

于 2011-05-23T14:05:18.200 に答える
2

さて、単語の最後で機能しないと言ったとき、問題がわかりました。$@または、その他のそのような特殊文字は単語の一部ではありません (したがって\b、入力文字列で他の文字が続いていない場合、'a$$' の場合は 'a' の後に単語が分割されます)。[^a-z]単語の終わりをマークして修正するために使用することをお勧めします。

preg_match_all("/\b".$f."(?:ing|er|es|s)?[^a-z]/si",$t,$m,PREG_SET_ORDER);
于 2011-05-23T11:54:18.810 に答える