代码之家  ›  专栏  ›  技术社区  ›  Toto

使用非字母重复清理字符串

  •  5
  • Toto  · 技术社区  · 14 年前

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

    Exemples:

    • 买我的产品!!!!!!!!!!!!!!!!!!!!!!!你说什么?
    • 买我的产品!?!?!?!?!?!?
    • 买我的产品!!!!!!!!!!!!!……!!!!!!!!!!!
    • 购买我的产品--

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

    所以我会得到:

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

    这个解决方案不能很好地工作:

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

    知道如何在PHP中使用regex吗?

    另一个更好的解决方案也受到欢迎(我不能去掉所有非字母数字字符,因为它们是有意义的)。

    编辑 :目的只是为了避免最常见的问题。其他创意案例将手动消毒或用其他regex消毒。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Zarel    14 年前

    这真是一个效率低下的问题,用正则表达式来解决,特别是在重复表达式任意大的情况下。实际上,它应该足以将重复表达式的长度限制在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);
    

    (也就是说,只需对可以在一行中显示的非字母数字字符的数目加上限即可。请注意,这需要根据与非拉丁字母(如俄语)的语言的兼容性进行调整。)

        2
  •  1
  •   alex    14 年前

    我有个不同的答案

    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
    
    }
    

    我希望这个regex是正确的,但我没有测试过。基本上,它应该检测某人的标题字符不是0-9、a-z(不区分大小写)、空白、下划线和破折号。当然,你可以根据自己的喜好修改这个。

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

    “刻意尝试的标题 吸引注意力而不受益 可以删除产品描述,但不删除 警告

        3
  •  0
  •   kennytm    14 年前

    使用非贪婪搜索?

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

    结果是

      * Buy my product !!
      * Buy my product !?
      * Buy my product !!!...!!
      * Buy my product <---