未检测到正则表达式preg_quote符号

时间:2011-05-23 11:37:57

标签: 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("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); ???

的任何建议

编辑:

所以我猜那个没有按预期工作的表达式就是例如。

$t

哪个应该在$m

中找到 f @ ck

更新:

这是我的用法,简单地说;如果"\*\*\*\*"中有匹配项将$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}}

我希望看到{{1}}作为结果。

3 个答案:

答案 0 :(得分:182)

答案 1 :(得分:3)

\b检查单词边界。根据{{​​3}}:

  

有三种不同的职位符合词边界:

     
      
  • 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  •   
  • 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  •   
  • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
  •   

“单词字符”是字母,数字和下划线,因此在字符串“a $$”中,单词边界出现在“a”之后,而不是出现在第二个“$”之后。

您可能需要使用类(例如[- '"])明确指定您认为是“字边界”的字符。

答案 2 :(得分:2)

现在,当你说它在单词结尾处不起作用时,我看到了问题。 $@或任何其他此类特殊字符不属于该字词(因此如果没有任何其他字母,\b在“a $$”的情况下会在'a'之后中断该字词在输入字符串中)。我建议使用[^a-z]标记单词的结尾以修复它。

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