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

时间:2010-03-28 10:07:33

标签: php regex

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

Exemples:

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

一些可接受的解决方案是将非alphanum的重复减少到2。

所以我会得到:

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

此解决方案效果不佳:

preg_replace('/(\W{2,})(?=\1+)/', '', $title)

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

其他更好的解决方案也受到欢迎(我不能删除所有非字母字符,因为它们可以理解)。

修改:目标只是避免大多数常见问题。其他创意案例将手动清理或使用其他正则表达式进行清理。

3 个答案:

答案 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 <---