使用非孤立的重复清理字符串

Tot*_*oto 5 php regex

当(创意)用户试图通过一些非孤立的重复"吸引注意力"时,我需要对文章标题进行消毒.

Exemples:

  • 买我的产品!!!!!!!!!!!!!!!!!!!!!!!!
  • 买我的产品!?!?!?!?!?!?
  • 买我的产品!!!!!!!!! ....... !!!!!!!!
  • 购买我的产品<-----------

一些可接受的解决方案是将非孤儿的重复减少到2.

所以我会得到:

  • 买我的产品!!
  • 买我的产品!?!?
  • 买我的产品!! .. !!
  • 购买我的产品< -

这个解决方案效果不好:

preg_replace('/(\W{2,})(?=\1+)/', '', $title)
Run Code Online (Sandbox Code Playgroud)

知道如何在PHP中使用正则表达式进行操作吗?

其他更好的解决方案也受到欢迎(我不能剥离所有非alphanum字符,因为它们是有意义的).

编辑:目标只是避免最常见的问题.其他创造性案例将手动消毒或使用其他正则表达式进行消毒.

Zar*_*rel 2

使用正则表达式解决这确实是一个低效的问题,特别是当重复的表达式任意大时。实际上,将重复表达式的长度限制在 3 到 5 左右就足够了,而且应该容易得多。

\n\n

就像是

\n\n
$title = preg_replace(\'/(\\W{1,5})(?=\\1+)/\', \'\', $title);\n
Run 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;\n
Run Code Online (Sandbox Code Playgroud)\n\n

将输出

\n\n
Buy my product !! Buy my product !? !? Buy my product !!..!! Buy my product <--\n
Run Code Online (Sandbox Code Playgroud)\n\n

这似乎通过了您的所有测试用例。

\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\n
Run Code Online (Sandbox Code Playgroud)\n\n

除了第一部分之外,其他内容不重复两次以上。似乎需要:

\n\n
$title = preg_replace(\'/(\\W{1,9})(?=\\1{2,})/\', \'\', $title);\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

(这意味着它preg_replace不支持 Unicode - 哦,好吧)

\n\n

您还可以将其调整为仅重复一次:

\n\n
$title = preg_replace(\'/(\\W{1,9})(?=\\1+)/\', \'\', $title);\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你的观点是,即使需要重复少于两次,也可以创建大量“ASCII 艺术”,那么,这超出了这个问题的范围。为了将 ASCII 艺术保持在最低限度,我建议简单地使用如下内容:

\n\n
preg_replace(\'/(\\W{5})\\W+/\', \'$1\', $title);\n
Run Code Online (Sandbox Code Playgroud)\n\n

(即仅限制可以在一行中显示的非字母数字字符的数量。请注意,这需要进行调整以与非拉丁字母的语言(例如俄语)兼容。)

\n