未检测到正则表达式preg_quote符号无法完成

2022-08-30 12:59:43

我在数据库中有一本脏话词典,下面的工作很棒

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

更新:

这是我的用法,简单地说;如果有匹配项,则将其替换为 ,则整个块位于字典中每个单词的循环内,是字典单词并且是输入$m"\*\*\*\*"$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. \*\*\*"


答案 1

无法完成

很抱歉,这个“问题”真的不可能解决。请考虑以下情况:

  • ꜰᴜᴄᴋ is U+A730.1D1C.1D04.1D0B, “\N{拉丁字母小写大写F}\N{拉丁字母小写大写U}\N{拉丁字母小写C}\N{拉丁字母小写K}”
  • fuck 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}”

答案 2

推荐