2

大家好,我正在尝试构建一个将维持以下标准的正则表达式。

本例中要审查的词“视图”。审查后要使用的字符:“%”,因为“*”弄乱了我的帖子格式。

单词使用示例:
view
views
preview
我去看了很棒
的景色 景色很棒不是吗。

文字审查后的示例:
%%%%
视图
预览
我去看了伟大
的 %%%% %%%% 是不是很棒。

这是我的一些代码:

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

麻烦的是这现在匹配所有内容,因为我在正则表达式“\ s”中使用“*”。任何想法我可以做些什么来满足我的标准?

4

4 回答 4

2

不匹配空格,使用单词边界

尝试

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

在 Regexr 上查看

您只需要确保的内容$word不以非单词字符开头或结尾,那么单词边界将不起作用。

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

替代方案:空白边界

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

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

在 Regexr 上查看

会像这样查看您的代码

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

(?<=^|\s)如果之前有字符串的开头或空格,将匹配

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

于 2012-05-16T12:57:31.967 回答
1

对于这个简单的任务,您不必使用缓慢且需要大量内存的正则表达式引擎,使用str_replace- 它用替换字符串替换所有出现的搜索字符串。

$string = str_replace(' view ','%',$string);
于 2012-05-16T12:58:53.893 回答
0

这会做...

$text_without_views = preg_replace('/(^|\W)view($|\W)/','\1***\2',$text_with_views);
于 2012-05-16T12:57:45.460 回答
0
$str = "view viewing view view";
$str = preg_replace('/(^|\b)view(\b|$)/is', ' %%%% ', $str);
echo $str;
于 2012-05-16T13:01:36.263 回答