当(创意)用户试图通过一些非孤立的重复"吸引注意力"时,我需要对文章标题进行消毒.
Exemples:
一些可接受的解决方案是将非孤儿的重复减少到2.
所以我会得到:
这个解决方案效果不好:
preg_replace('/(\W{2,})(?=\1+)/', '', $title)
Run Code Online (Sandbox Code Playgroud)
知道如何在PHP中使用正则表达式进行操作吗?
其他更好的解决方案也受到欢迎(我不能剥离所有非alphanum字符,因为它们是有意义的).
编辑:目标只是避免最常见的问题.其他创造性案例将手动消毒或使用其他正则表达式进行消毒.
使用正则表达式解决这确实是一个低效的问题,特别是当重复的表达式任意大时。实际上,将重复表达式的长度限制在 3 到 5 左右就足够了,而且应该容易得多。
\n\n就像是
\n\n$title = preg_replace(\'/(\\W{1,5})(?=\\1+)/\', \'\', $title);\nRun Code Online (Sandbox Code Playgroud)\n\n应该管用。
\n\n一些初步测试表明
\n\n$title = \'Buy my product !!!!!!!!!!!!!!!!!!!!!!!! Buy my product !? !? !? !? !? !? Buy my product !!!!!!!!!.......!!!!!!!! Buy my product <-----------\';\n\n$title = preg_replace(\'/(\\W{1,5})(?=\\1{2,})/\', \'\', $title);\n\necho $title;\nRun Code Online (Sandbox Code Playgroud)\n\n将输出
\n\nBuy my product !! Buy my product !? !? Buy my product !!..!! Buy my product <--\nRun Code Online (Sandbox Code Playgroud)\n\n这似乎通过了您的所有测试用例。
\n\n回复:戈登
\n\n你的字符串:
\n\n\xc2\xb8\xc2\xb7\xc2\xb4`\xc2\xb7\xc2\xb8\xc2\xb7\xc2\xb4`\xc2\xb7\xc2\xb8\xc2\xb7\xc2\xb4`\xc2\xb7\xc2\xb8 Human \xc2\xb7-> creativity << is endless !\xc2\xa1!\xc2\xa1! \xe2\x98\xbb\xe2\x98\xba\nRun Code Online (Sandbox Code Playgroud)\n\n除了第一部分之外,其他内容不重复两次以上。似乎需要:
\n\n$title = preg_replace(\'/(\\W{1,9})(?=\\1{2,})/\', \'\', $title);\nRun Code Online (Sandbox Code Playgroud)\n\n在它简化为之前
\n\n\xc2\xb8\xc2\xb7\xc2\xb4`\xc2\xb7\xc2\xb8\xc2\xb7\xc2\xb4`\xc2\xb7\xc2\xb8 Human \xc2\xb7-> creativity << is endless !\xc2\xa1!\xc2\xa1! \xe2\x98\xbb\xe2\x98\xba\nRun Code Online (Sandbox Code Playgroud)\n\n(这意味着它preg_replace不支持 Unicode - 哦,好吧)
您还可以将其调整为仅重复一次:
\n\n$title = preg_replace(\'/(\\W{1,9})(?=\\1+)/\', \'\', $title);\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下它变成:
\n\n\xc2\xb8\xc2\xb7\xc2\xb4`\xc2\xb7\xc2\xb8 Human \xc2\xb7-> creativity < is endless !\xc2\xa1! \xe2\x98\xbb\xe2\x98\xba\nRun Code Online (Sandbox Code Playgroud)\n\n如果你的观点是,即使需要重复少于两次,也可以创建大量“ASCII 艺术”,那么,这超出了这个问题的范围。为了将 ASCII 艺术保持在最低限度,我建议简单地使用如下内容:
\n\npreg_replace(\'/(\\W{5})\\W+/\', \'$1\', $title);\nRun Code Online (Sandbox Code Playgroud)\n\n(即仅限制可以在一行中显示的非字母数字字符的数量。请注意,这需要进行调整以与非拉丁字母的语言(例如俄语)兼容。)
\n