当(创意)用户试图通过一些非孤立的重复“吸引注意力”时,我需要对文章标题进行消毒。
Exemples:
一些可接受的解决方案是将非alphanum的重复减少到2。
所以我会得到:
此解决方案效果不佳:
preg_replace('/(\W{2,})(?=\1+)/', '', $title)
知道如何在PHP中使用正则表达式进行操作吗?
其他更好的解决方案也受到欢迎(我不能删除所有非字母字符,因为它们可以理解)。
修改:目标只是避免大多数常见问题。其他创意案例将手动清理或使用其他正则表达式进行清理。
答案 0 :(得分:2)
使用正则表达式解决这个问题确实是一个低效的问题,特别是如果重复表达式是任意大的话。实际上,它足以将重复表达的长度限制在3到5之间,并且它应该更容易。
像
这样的东西$title = preg_replace('/(\W{1,5})(?=\1+)/', '', $title);
应该有用。
一些初步测试表明
$title = 'Buy my product !!!!!!!!!!!!!!!!!!!!!!!! Buy my product !? !? !? !? !? !? Buy my product !!!!!!!!!.......!!!!!!!! Buy my product <-----------';
$title = preg_replace('/(\W{1,5})(?=\1{2,})/', '', $title);
echo $title;
将输出
Buy my product !! Buy my product !? !? Buy my product !!..!! Buy my product <--
这似乎通过了所有测试用例。
回复:戈登
你的字符串:
¸·´`·¸·´`·¸·´`·¸ Human ·-> creativity << is endless !¡!¡! ☻☺
除了第一部分之外,不会重复任何事情两次以上。似乎需要:
$title = preg_replace('/(\W{1,9})(?=\1{2,})/', '', $title);
之前简化为
¸·´`·¸·´`·¸ Human ·-> creativity << is endless !¡!¡! ☻☺
(这意味着preg_replace
不支持Unicode - 哦,好吧)
您也可以将其调整为仅重复一次:
$title = preg_replace('/(\W{1,9})(?=\1+)/', '', $title);
在这种情况下变为:
¸·´`·¸ Human ·-> creativity < is endless !¡! ☻☺
如果您的观点是可以创建大量的“ASCII艺术”,即使它需要重复不到两次,那么,这超出了这个问题的范围。为了将ASCII艺术保持在最低限度,我建议只使用以下内容:
preg_replace('/(\W{5})\W+/', '$1', $title);
(即只限上可以连续显示的非字母数字字符的数量。请注意,这需要调整以与非拉丁字母的语言兼容,如俄语。)
答案 1 :(得分:1)
我的答案有点不同
if (preg_match('/^[^\da-z\s_-]$/i', $str)) {
// auto post, but flag to moderator to inspect title OR
// instead of auto posting, put in 'waiting to be authorised' by a mod
}
我希望我的正则表达式是正确的,但我还没有测试过。基本上它应该检测何时某人的标题字符不是0-9,A-Z(不区分大小写),空格,下划线和短划线。当然,您可以根据自己的喜好对其进行修改。
通知最终用户
也是个好主意“刻意尝试的标题 吸引注意力而不受益 产品说明可能会被删除 警告“
答案 2 :(得分:0)
使用非贪婪搜索?
preg_replace('/(\W{2,}?)(?=\1+)/', '', '{{your data}}');
结果是
* Buy my product !!
* Buy my product !?
* Buy my product !!!...!!
* Buy my product <---