Php 使用非alphanum重复清理字符串

Php 使用非alphanum重复清理字符串,php,regex,Php,Regex,当(有创意的)用户试图通过一些非字母重复来“吸引注意”时,我需要清理文章标题 例如: 买我的产品 买我的产品 买我的产品吧 购买我的产品用正则表达式解决这个问题效率很低,特别是当重复表达式任意大时。实际上,只要将重复表达式的长度限制在3到5左右就足够了,而且应该容易得多 差不多 $title = preg_replace('/(\W{1,5})(?=\1+)/', '', $title); 应该有用 一些初步测试显示, $title = 'Buy my product !!!!!!!!!!!

当(有创意的)用户试图通过一些非字母重复来“吸引注意”时,我需要清理文章标题

例如:

  • 买我的产品
  • 买我的产品
  • 买我的产品吧
  • 购买我的产品用正则表达式解决这个问题效率很低,特别是当重复表达式任意大时。实际上,只要将重复表达式的长度限制在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;
    
    在它简化为

    ¸·´`·¸·´`·¸ Human ·-> creativity << is endless !¡!¡! ☻☺
    
    在这种情况下,它变成:

    ¸·´`·¸ Human ·-> creativity < is endless !¡! ☻☺
    
    (即,只需限制一行中可显示的非字母数字字符的数量。请注意,这需要进行调整,以便与具有非拉丁字母的语言(如俄语)兼容。)

    是否使用非贪婪搜索

    preg_replace('/(\W{2,}?)(?=\1+)/', '', '{{your data}}');
    
    结果是

      * Buy my product !!
      * Buy my product !?
      * Buy my product !!!...!!
      * Buy my product <---
    
    *购买我的产品!!
    *买我的产品!?
    *买我的产品!!!。。。!!
    
    *购买我的产品我的答案有点不同

    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(不区分大小写)、空格、下划线和破折号的字符。当然,您可以根据自己的喜好对其进行修改

    通知最终用户也是一个好主意

    “故意试图 吸引注意力而无益处 可以删除产品说明,而不必删除 警告“


    创造性在描述中输入废话不仅包括感叹号,还包括“购买mu产品”等标题。我想这类事情不能用regexp检查,最好由编辑和/或社区编辑/检查标题,过滤掉没有意义的标题。@Gordon我编辑了我的回复;新版本将传递问题中的所有字符串。@Zarel请使用我在问题注释中给出的字符串进行尝试。另外:如果您真的只想减少标题中的“ASCII艺术”,只需执行
    preg_replace('/(\W{5})\W+/','$1',$title)之类的操作即可(即,仅限制一行中可显示的非字母数字字符的数量。请注意,这可能会导致使用非拉丁字母的语言出现问题,如俄语。)@Zarel OP要求的问题无法解决。排列字符的可能性是无限的。即使删除了多次出现的奇数字符,仍然可以使用类似“x x x Best offers here x x x x x”的字符串,您的解决方案对此不做任何处理。如果这是可能的,就不会再有垃圾邮件了。@Gordon消除任何“ASCII艺术”——比如在标题中——是不可能的,是的。但是,将非alnum字符的重复次数减少到2是可能的,而这恰好是被问到的问题。在Stack Overflow,我们感兴趣的是后者这样的数学问题的解决方案,而不是前者那样的社会问题。@Toto:奇怪,对我有用。查看更新的完整PHP代码是否有帮助。
    
    $title = preg_replace('/(\W{1,9})(?=\1+)/', '', $title);
    
    ¸·´`·¸ Human ·-> creativity < is endless !¡! ☻☺
    
    preg_replace('/(\W{5})\W+/', '$1', $title);
    
    preg_replace('/(\W{2,}?)(?=\1+)/', '', '{{your data}}');
    
      * Buy my product !!
      * Buy my product !?
      * Buy my product !!!...!!
      * Buy my product <---
    
    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
    
    }