【问题标题】:Remove all 0s except trailing 0s from a string从字符串中删除除尾随 0 之外的所有 0
【发布时间】:2012-11-03 03:23:46
【问题描述】:

关于删除前导和尾随 0 有很多问题,但我找不到删除所有 0 的方法,除了尾随 0(前导 0 或除结尾以外的任何其他位置)。

100010 -> 110  
010200 -> 1200  
01110  -> 1110

有什么建议吗?

【问题讨论】:

  • 你可以使用正则表达式来做到这一点。
  • 转成整数再转回字符串?
  • @bendataclear 不,他也想删除中间的 0。

标签: php trailing


【解决方案1】:

您想替换所有不在字符串末尾的零。

您可以使用一些带有所谓的负前瞻的正则表达式来做到这一点,因此只有不在字符串末尾的零匹配被替换:

$actual = preg_replace('/0+(?!$|0)/', '', $subject);

$ 表示字符串的结尾。 0+ 表示一个或多个零。那就是贪心,意思是,如果有两个,就需要两个,而不是一个。这很重要,不要在最后更换。但也需要写出来,被替换的东西不能跟0。

很像你的句子:

一种删除除尾随 0 之外的所有 0 的方法(前导 0 或除结尾以外的任何其他位置)。

即:0+(?!$|0)。见http://www.regular-expressions.info/lookaround.html - Demo

另一个变体是atomic grouping,应该更直接一点(Demo):

(?>0+)(?!$)

【讨论】:

  • 测试用例失败:010200 -> 1200.
  • @nickb:第一个答案我有点快,编辑了。
【解决方案2】:

你可以使用正则表达式来做你想做的事:

if(preg_match('/^(0*)(.*?)(0*)$/',$string,$match)) {
    $string = $match[1] . str_replace('0','',$match[2]) . $match[3];
}

【讨论】:

    【解决方案3】:

    这里有一个解决方案。应该有更漂亮的,但这也有效。

    $subject = "010200";
    $match = array();
    preg_match("/0*$/",$subject,$match);
    echo preg_replace("/0*/","",$subject).$match[0];
    

    【讨论】:

      【解决方案4】:
      // original string
      $string = '100010';
      
      // remember trailing zeros, if any
      $trailing_zeros = '';
      if (preg_match('/(0+)$/', $string, $matches)) {
          $trailing_zeros = $matches[1];
      }
      
      // remove all zeros
      $string = str_replace('0', '', $string);
      // add trailing ones back, if they were found before
      $string .= $trailing_zeros;
      

      【讨论】:

        【解决方案5】:

        您可以按照其他人的建议使用正则表达式,或者修剪。计算尾随的 0,去掉所有的 0,然后添加尾随的 0。

        $num = 10100;
        $trailing_cnt = strlen($num)-strlen(trim($num, "0"));
        $num = str_replace('0','',$num).str_repeat('0', $trailing_cnt);
        

        【讨论】:

          【解决方案6】:

          试试

          echo preg_replace('/0+([1-9])/', '$1', $str);
          

          【讨论】:

            【解决方案7】:

            您可以使用正则表达式 [0]+(?=[1-9]) 查找零(使用正向前瞻)并使用 preg_replace 将它们替换为空字符串(假设数字已经是字符串形式)。

            $result = preg_replace("#[0]+(?=[1-9])#", "", "100010");
            

            在行动中看到它here

            【讨论】:

              【解决方案8】:

              不是最漂亮的,但它确实有效......

              $str = "01110";
              
              if(substr($str,-1) == 0){
                  $str = str_replace("0","",$str)."0";
              }else{
                  $str = str_replace("0","",$str);
              }
              
              echo $str; // gives '1110'
              

              【讨论】:

                猜你喜欢
                • 2021-09-22
                • 2011-10-04
                • 2010-11-12
                • 2023-03-15
                • 2020-07-23
                • 2020-03-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多