【问题标题】:Remove 2 or less linebreaks删除 2 个或更少的换行符
【发布时间】:2012-10-03 23:09:37
【问题描述】:

如何使用 str_replace 查找每个结尾方括号 ']' 并从结尾删除 2 个或更少的换行符。因此,如果 ] 之后有 1 或 2 个换行符,它将全部删除。如果有 3 个,你会在 ] 之后得到 1 个。 4 你最终会得到 2 等等。

感谢您的帮助

【问题讨论】:

    标签: php regex line-breaks


    【解决方案1】:

    既然您提到了str_replace,我假设您使用的是PHP(如果是这种情况,您应该为此添加一个标签!)。并且由于您标记了正则表达式,您可能希望使用 preg_replace 来代替。那么这应该独立于平台工作:

    $newstr = preg_replace('/\](?:\r\n|\n|\r){1,2}/', ']', $str);
    

    $str 显然是您的原始字符串。

    注意] 被转义了,因为它是一个特殊的正则表达式字符(用于字符类)。圆括号仅包含所有可能的换行符的列表。 ?: 是可选的,并且与需要访问捕获的子模式的复杂正则表达式更相关(实际上?: 说,不要匹配这个子模式,因为我不需要它)。 {1,2} 只是说,匹配其中的一两个。而且由于正则表达式默认是贪婪的,如果可以的话,它需要两个。

    编辑:再想一想。你可以用str_replace 解决这个问题,但对于所有可能的换行符来说,一次就不太好(因为str_replace 不支持替代方案)。 This example 可能会给你一个想法。

    【讨论】:

    • 有没有办法排除最后一个括号是 '[/h1]' 序列的一部分的情况?
    • Yes, it's called negative lookbehind. 例如:'/(?[ 和 /(因为它是我选择的分隔符)。
    • 非常感谢您在这方面的帮助。一旦我玩弄了这个 - 我意识到我真正想做的是。如果它是 '[/h1]' 我需要删除 1-3 \n。如果它有任何其他 ']' 我需要删除 1-2 \n。我设法用很多代码来做到这一点......但是有没有一个优雅的解决方案?
    【解决方案2】:

    str_replace,

    mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
    

    不支持正则表达式,你要的是preg_replace

    mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
    

    使用'/\](?:\r\n|\n|\r){0,2}/' 之类的模式并替换']'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      相关资源
      最近更新 更多