【问题标题】:PHP Replace Leading Zeros with Same Number of SpacesPHP用相同数量的空格替换前导零
【发布时间】:2020-10-17 05:48:23
【问题描述】:

我想用带有 3 个空格的“1”替换像 0001 这样的字符串。

我试过 str_replace 但这在 0010 上不起作用。 我尝试了一些 preg_replace 但无法获得替换相同号码的替换权

我已经写了这个基本的东西,它可以工作,但如果可能的话,我正在寻找更有效的东西。

$pin = '0010';
$temp = ltrim($pin, '0');
$spaces = strlen($pin) - strlen($temp);
for ($x=1;$x<=$spaces;$x++) $temp = ' '.$temp;
echo $temp;

与 preg_replace 最接近的是这个,但我不确定如何替换:

preg_replace('/0+/', ' ', $pin)

【问题讨论】:

  • 效率是否非常重要,因为您在一次执行中对数十万个字符串执行这种零替换?

标签: php preg-replace trim


【解决方案1】:

\G 赢了!

https://www.regular-expressions.info/continue.html

\G 将匹配字符串的开头并继续匹配,直到无法匹配为止。

What is the use of '\G' anchor in regex?

从字符串的开头匹配一个零,然后一次匹配后面的每个零。用空格替换每个匹配的零。

代码:(Demo)

$pin = '0010';
var_export(preg_replace('~\G0~', ' ', $pin));

输出:

'  10'

【讨论】:

    【解决方案2】:

    我不知道如何使用正则表达式更轻松地做到这一点,但您可以使用 str_repeat 使您的其他代码更简洁:

    $pin = '0010';
    $temp = ltrim($pin, '0');
    $spaces = strlen($pin) - strlen($temp);
    $new_pin = str_repeat(' ', $spaces) . $temp;
    echo $new_pin;
    

    【讨论】:

    • 您可以将其中一些语句组合起来以减少代码行数,但我相信这将更具可读性。比起聪明的代码,我总是更喜欢可读的代码。
    【解决方案3】:

    你说:

    但如果可能的话,我正在寻找更有效的方法

    • 首先,请注意,单行不一定有效(正如您尝试使用 preg_replace() 并且正则表达式实际上要慢一些,因为它首先被编译)。
    • 其次,您可以更好地采用 just 对字符串进行 2 次传递的方法。这也可以在没有额外字符串变量的情况下就地编辑字符串,这在您的情况下是理想的。

    片段:

    <?php
    
    $str = '000010';
    $len = strlen($str);
    
    for($i = 0; $i < $len; ++$i){
        if($str[$i] == '0'){
            $str[$i] = ' ';
        }else{
            break;
        }
    }
    
    echo $str;
    

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 1970-01-01
      • 2012-03-26
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多