【问题标题】:Target excess whitespaces but keep new lines定位多余的空格,但保留新行
【发布时间】:2019-03-22 07:51:35
【问题描述】:

我正在尝试在数据库迁移期间清理一些字符串并删除多余的空格。

    An example of a string would be like this
          and for some reason has empty spaces
                in the beginning of new lines.

有时新行开头只有 1 个空格。

我需要保留单词和换行符之间的空间。

我尝试了以下方法:

$string = str_replace(' ', ' ', $string); (只替换一些,还不够)

$string = preg_replace('/\s++', ' ', $string); (删除换行符)

我想出的最接近的东西就是这个怪物:

        $string = str_replace('    ', ' ', $string);
        $string = str_replace('   ', ' ', $string);
        $string = str_replace('  ', ' ', $string);
        $string = str_replace('  ', ' ', $string);
        $string = str_replace(' ', ' ', $string);
        $string = str_replace(' ', ' ', $string);
        $string = str_replace('\r ', '\r', $string);
        $string = str_replace('\n ', '\n', $string);

它会删除大部分空白,保留新行,但仍设法在新行开头保留 1 个烦人的额外空格。

正确执行此操作的最佳方法是什么?

【问题讨论】:

    标签: php regex string


    【解决方案1】:

    你可以用这个

    preg_replace('/\s+/S', " ", $string);
    

    这应该用一个替换所有多个空格、制表符和换行符。

    【讨论】:

    • 我试过了,它没有保留断线
    【解决方案2】:

    你可以用这个:

    $string = preg_replace('/[ ]+/', ' ', $string);
    

    它应该用一个空格替换多个空格(不是换行等其他空格)。

    编辑

    如果您需要从行首删除空格,您可以使用此模式再次运行preg_replace

      $string = preg_replace('/^[ ]+/m', '', $string);
    

    这将在行首搜索一个或多个空格,替换为空字符串。

    【讨论】:

    • 谢谢,这基本上是在以一种优雅的方式做同样的事情!你知道我怎样才能让它瞄准出现在断线之后的一个空格吗?
    【解决方案3】:

    您可以使用交替来匹配从行首开始的 1+ 个水平空白字符或在单词之间保留 1 个水平空白字符并匹配后面的字符。

    然后用空字符串替换。

    ^\h+|\h\K\h+

    说明

    • ^\h+ 断言字符串的开头并匹配一个或多次水平空白字符
    • |或者
    • \h\K\h+ 匹配水平空白字符,忘记匹配的内容,然后匹配水平空白字符一次或多次

    Regex demo | Php demo

    如果你只想从字符串的开头匹配,你可以使用^\h+

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      相关资源
      最近更新 更多