大家好我试图建立一个能够维持以下标准的正则表达式。
在此示例“视图”中要审查的字词。 审查后使用的字符:“%”,因为“*”搞乱我的帖子格式化。
字使用示例:
查看
意见
预览
我去看了很棒的观点
这个观点很棒,不是吗。
单词审查员后的示例:
%%%%
意见
预览
我去看了伟大的%%%%
%%%%很棒,不是吗。
以下是我的一些代码:
$string = preg_replace_callback('/\s*'. preg_quote($word, '\\') .'\s*/is', 'bbcode_callback_censored', $string);
麻烦是因为我在正则表达式“\ s”中使用“*”,所以现在匹配所有内容。我能做些什么来达到我的标准?
答案 0 :(得分:2)
不匹配空格,请使用 word boundary
尝试
$string = preg_replace_callback('/\b'. preg_quote($word, '\\') .'\b/is', 'bbcode_callback_censored', $string);
您只需要确保$word
的内容不以非单词字符开头或结尾,然后单词边界将无效。
\b
是一个单词边界。它匹配从单词字符(在\w
中定义)到\W
中定义的非单词字符的变化,或者相反。
替代方案:空白边界
如果您不喜欢单词边界,因为您的单词可能以“#view”之类的非单词字符开头或结尾,请定义您自己的“空白边界”,例如像这样:
(?<=^|\s)#view(?=$|\s)
会像你一样查看你的代码
$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;