【问题标题】:Replace 3d whitespace with comma and whitespace in string用逗号和字符串中的空格替换 3d 空格
【发布时间】:2018-10-17 05:03:50
【问题描述】:

要在字符串中用逗号和空格替换空格,我应该这样做:

$result = preg_replace('/[ ]+/', ', ', trim($value));

结果:Some, example, here, for, you

但是,我只想替换 3d 空白,因此结果如下所示:

Some example here, for you

我该怎么做?

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

    你可以使用类似的东西

    $value = " Some example here for you ";
    $result = preg_replace('/^\S+(?:\s+\S+){2}\K\s+/', ',$0', trim($value), 1);
    echo $result; // => Some example here, for you
    

    请参阅PHP demoregex demo

    模式详情

    • ^ - 字符串开头
    • \S+ - 1+ 个非空格
    • (?:\s+\S+){2} - 连续两次出现
      • \s+ - 1+ 个空格
      • \S+ - 1+ 个非空格
    • \K - 匹配重置运算符
    • \s+ -(替换模式中的 $0 引用此子字符串)1+ 个空格。

    【讨论】:

    • 比我更喜欢这个解决方案。优雅得多。虽然,如果它在字符串的末尾,它不会替换空格。不过,不确定预期的行为是什么。
    • @FelippeDuarte 字符串末尾不能有空格,$valuetrim()med。
    【解决方案2】:

    您可以使用回调函数并控制何时替换:

    <?php
    
    $string = 'Some example here for you';
    $i = 0;
    $string = preg_replace_callback('/\s+/',function($m) use(&$i){
        $i++;
        if($i == 3) {
            return ', ';
        }
        return ' ';
    },$string);
    
    echo $string;
    

    【讨论】:

      【解决方案3】:

      试试这个

      $result = preg_replace('/^([^\s]+)\s+((?1)\s+(?1))/', '\1 \2,', trim($value));
      

      Test it

      解释:

      • ^ 字符串开头
      • ([^\s]+) - 捕捉一切而不是空间
      • \s+空格1个或更多
      • ((?1)\s+(?1)) - (?1) 重复第一个捕获组,我们这样做 2x 之间有一个空格,然后捕获它。我想您可以单独捕获它们,但有什么意义。

      (?{n}) 的好处在于,如果您必须更改捕获单词的正则表达式,您只需更改 1 次,而不是 3 次。可能在这里没那么重要,但我喜欢使用它。 ..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-31
        • 2021-12-07
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        • 2015-01-13
        相关资源
        最近更新 更多