PHP Word Censor帮助,基于使用正则表达式的标准检查单词

时间:2012-05-16 12:45:41

标签: php regex

大家好我试图建立一个能够维持以下标准的正则表达式。

在此示例“视图”中要审查的字词。 审查后使用的字符:“%”,因为“*”搞乱我的帖子格式化。

字使用示例:
查看
意见
预览
我去看了很棒的观点 这个观点很棒,不是吗。

单词审查员后的示例:
%%%%
意见
预览
我去看了伟大的%%%% %%%%很棒,不是吗。

以下是我的一些代码:

$string = preg_replace_callback('/\s*'. preg_quote($word, '\\') .'\s*/is', 'bbcode_callback_censored', $string);

麻烦是因为我在正则表达式“\ s”中使用“*”,所以现在匹配所有内容。我能做些什么来达到我的标准?

4 个答案:

答案 0 :(得分:2)

不匹配空格,请使用 word boundary

尝试

$string = preg_replace_callback('/\b'. preg_quote($word, '\\') .'\b/is', 'bbcode_callback_censored', $string);

here on Regexr

您只需要确保$word的内容不以非单词字符开头或结尾,然后单词边界将无效。

\b是一个单词边界。它匹配从单词字符(在\w中定义)到\W中定义的非单词字符的变化,或者相反。

替代方案:空白边界

如果您不喜欢单词边界,因为您的单词可能以“#view”之类的非单词字符开头或结尾,请定义您自己的“空白边界”,例如像这样:

(?<=^|\s)#view(?=$|\s)

here on Regexr

会像你一样查看你的代码

$string = preg_replace_callback('/(?<=^|\s)'. preg_quote($word, '\\') .'(?=$|\s)/is', 'bbcode_callback_censored', $string);
如果在

之前有字符串的开头或空格,

(?<=^|\s)将匹配 如果字符串的结尾或前面的空格

(?=$|\s)将匹配

答案 1 :(得分:1)

对于这个简单的任务,你不必使用慢速和内存饥饿的正则表达式引擎,使用str_replace - 它用替换字符串替换所有出现的搜索字符串。

$string = str_replace(' view ','%',$string);

答案 2 :(得分:0)

这样做......

$text_without_views = preg_replace('/(^|\W)view($|\W)/','\1***\2',$text_with_views);

答案 3 :(得分:0)

$str = "view viewing view view";
$str = preg_replace('/(^|\b)view(\b|$)/is', ' %%%% ', $str);
echo $str;