Php 未检测到正则表达式前引号符号

Php 未检测到正则表达式前引号符号,php,regex,preg-match,profanity,Php,Regex,Preg Match,Profanity,我在数据库中有一本咒骂词词典,下面的内容非常有用 preg_match_all("/\b".$f."(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER); $t是输入文本,简单地说,$f=preg_quote(“朋克”)“朋克”来自数据库字典,因此在循环的这一点上,表达式如下 preg_match_all("/\bpunk(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER); preg\u quote将符号(如\\\\\

我在数据库中有一本咒骂词词典,下面的内容非常有用

preg_match_all("/\b".$f."(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
$t
是输入文本,简单地说,
$f=preg_quote(“朋克”)
<代码>“朋克”来自数据库字典,因此在循环的这一点上,表达式如下

preg_match_all("/\bpunk(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
preg\u quote
将符号(如
\\\\\\\\\\\\\\\\\\\\
替换为
\\\\\\\\\\\\\\\\\\\\
),以便表达式转义,但在字典检查时,例如
”F@CK“
“A$$”
这些符号在具有上述表达式的输入字符串中未检测到,我有
A$$
f@ck
在字典中,但它们不起作用。如果我删除单词上的
preg_quote()
,则正则表达式无效,因为这些符号没有转义

关于如何检测
“a$$”
?有什么建议吗

编辑:

因此,我猜不按预期工作的表达式是eg

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\u 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$$孔”
,结果很好,但
“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);
}

我希望看到
“在这里输入您喜欢的任何内容,例如\*\*\*”

现在,当您在单词末尾说它不起作用时,我看到了问题所在
$@
或任何其他此类特殊字符不是单词的一部分(因此,
\b
在“a$$”的情况下,如果输入字符串中没有后跟任何其他字母,则在“a”之后打断单词)。我建议用
[^a-z]
标记单词的结尾来修复它

preg_match_all("/\b".$f."(?:ing|er|es|s)?[^a-z]/si",$t,$m,PREG_SET_ORDER);

\b
检查单词边界。根据:

有三种不同的位置可以作为单词边界:

  • 在字符串的第一个字符之前,如果第一个字符是单词字符
  • 如果最后一个字符是单词字符,则在字符串中最后一个字符之后
  • 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符
“单词字符”是字母、数字和下划线,因此在字符串“a$$”中,单词边界出现在“a”之后,而不是第二个“$”之后

您可能需要通过使用类来明确指定您认为是“Word边界”的字符(例如,<代码>(-')] />代码>

不能完成。 对不起,这个“问题”真的是不可能解决的。
  • ꜰᴜᴄᴋ 是U+A730.1D1C.1D04.1D0B,“\N{拉丁字母小写字母F}\N{拉丁字母小写字母U}\N{拉丁字母小写字母C}\N{拉丁字母小写字母K}”
  • ᶠᵘᶜᵏ 是U+1DA0.1D58.1D9C.1D4F,“\N{修饰字母小F}\N{修饰字母小U}\N{修饰字母小C}\N{修饰字母小K}”

  • 您能在示例代码中包括如何使用
    preg\u quote()
    吗?这让我想起了@Prof83.Hmm。为什么要使用preg\u match和preg\u replace?您不能只使用preg\u replace并在前后比较字符串以确定是否匹配?这是不可能的。请参阅我的答案以了解为什么。Ass的“a$\b”“不起作用,记住这是在断言美元符号后面有一个单词字符。你最好训练一个贝叶斯过滤器,根据帖子中的单词和字符将帖子分类为“好”或“坏”。然后,让它如此糟糕的帖子不立即得到张贴,但需要审查。使用不寻常的unicode字符会被标记为可能的不良帖子。我需要为您提供更好的输出结果,尽管您的答案听起来很有希望,但它仍然不起作用,有没有办法让你得到我正在使用的字典和类?很容易给出大量字符串,这些字符串将通过这种方法潜行。这是注定要失败的。好吧,等等,你是在告诉我这是不可能被取代的(“a$$”,“***”,“你a$$”)???这听起来不对,我不是在寻找类似于“S”的字符,我是在试图在字典中找到一组给定的单词,如果有人发布了“a###hole”而它不在字典中,那么我们会将其添加到字典中???我需要为您提供更好的输出结果,尽管你的答案听起来很有希望,但它仍然不起作用,有没有办法让你找到我正在使用的字典和类?在你的OP中添加一个snipt.org URL。他可能会改进他的模式,但他永远也解决不了这个问题。这是不可能做到的:看看我的答案,为什么。我记得几年前我使用了各种各样的Unicode技巧来绕过亵渎过滤器,但还是被禁止了。好时光。现在,如果苏的神能阅读并理解这个答案,停止愚蠢的审查就好了。@sbi好吧,在那之前,当我们的问题真的需要解决时,我们仍然可以使用西里尔字母。这里,拿一个:ҏѓґґꙑӏеҽҿӗӎ; 即使在ascii中,你也可以用“ph”代替“f”等。事实上,这并不像你想象的那么难,因为存在consusables.txt、consusablessummary.txt和consusableswhitscript.txt。