【问题标题】:Replace the leading space with   with the same number of times using a PHP regular expression使用 PHP 正则表达式将前导空格替换为相同次数
【发布时间】:2010-07-27 10:46:23
【问题描述】:

我想用出现次数相同的  替换前导空格。

说明:

如果输入中存在一个前导空格,则应将其替换为一个 

如果输入中存在两个前导空格,则应将其替换为两个  s。

如果输入中存在 n 个前导空格,则应将其替换为恰好 n 次。

示例 1:

My name is XYZ

输出:

 My name is XYZ

示例 2:

  My name is XYZ

输出:

  My name is XYZ

如何使用 PHP 正则表达式仅替换前导空格?

【问题讨论】:

    标签: php regex


    【解决方案1】:
    preg_replace('/\G /', ' ', $str);
    

    \G 匹配最后一个匹配结束的位置,或者如果之前没有任何匹配,则匹配字符串的开头。

    实际上,在 PHP 中,它匹配 下一个 匹配应该开始的位置。这不一定与上一场比赛结束的地方相同。

    【讨论】:

    • @All :感谢大家的回复。 @Alan:我遵循了您的方法。我只是想知道更好的方法来遵循标志“G”、“m”和“e”中哪一个是最佳的、有效的,这样我就会有实际理由使用提到的标志
    • 好吧,m 允许^ 匹配行首和字符串的开头,因此在这种情况下它不相关。 e 导致替换被视为代码而不是静态字符串。这确实会变得非常昂贵,但实际上代码通常又短又快。即便如此,\G 通常是最有效的选择。
    【解决方案2】:
    $len_before = strlen($str);
    $str = ltrim($str, ' ');
    $len_after = strlen($str);
    $str = str_repeat(' ', $len_before - $len_after) . $str;
    

    使用preg_replace也有

    $str = preg_replace('/^( +)/e', 'str_repeat(" ", strlen("$1"))', $str);
    

    但请注意,它使用/e 标志。

    结果见http://www.ideone.com/VWNKZ

    【讨论】:

    • 这不是正则表达式,但它是最好的方法,而且不那么繁重! +1
    • 不要忘记 m 标志让^ 匹配行首。
    • 链接已损坏。
    【解决方案3】:

    用途:

    preg_replace('/^ +/m', ' ', $str);
    

    You can test it here.

    【讨论】:

    • 目标是用  替换每个 的前导空格。您将 all 替换为 one  .
    • @alan 你是对的。我的错...我讨厌斜线作为分隔符,顺便说一句,为什么我使用#..
    【解决方案4】:

    使用 preg_match 并设置 PREG_OFFSET_CAPTURE 标志。偏移量是“空格”的长度。然后使用带有偏移量的 str_repeat。

    【讨论】:

      猜你喜欢
      • 2010-09-17
      • 2016-11-07
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2020-10-17
      • 1970-01-01
      • 2019-03-04
      相关资源
      最近更新 更多