我在数据库中有一个发誓单词的字典,以下内容很棒
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@ck
和preg_quote()
,但它们不起作用。如果我删除单词上的"a$$"
,则正则表达式无效,因为这些符号未被转义。
有关如何检测preg_match_all("/\bf\@ck(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
???
编辑:
所以我猜那个没有按预期工作的表达式就是例如。
$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}}
我希望看到{{1}}作为结果。
答案 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);