代码之家  ›  专栏  ›  技术社区  ›  DasSaffe

从字符串结尾查找大于0的数字的第一次出现

php
  •  0
  • DasSaffe  · 技术社区  · 5 年前

    我有点问题,或者只是隧道问题:我想从字符串的末尾得到第一个数字,它是 0 . 给定的字符串只包含数字是100%安全的。

    $number = 902200100;
    $firstZero = strpos($number, "0");
    preg_match('/[1-9]/', $n, $matches, PREG_UNMATCHED_AS_NULL, -1);
    
    var_dump($matches);
    
    echo "first zero: " . $firstZero;
    echo "\r\n";
    echo "last non-zero: " . $matches[0][0];
    

    输出为:

    first zero: 1 正确,第一个零在位置2[索引1]。

    last non-zero: 0 是错误的,应该是2(从右起的位置3,索引2)。

    我想把旗子换成 PREG_OFFSET_CAPTURE 好吧,但那没用。有没有可能,偏移量 -1 不在这里工作吗?那么正确的方法是什么呢?

    我还将模式从[0-9]改为[1-9],感觉1-9根本不产生输出。

    沙盒: http://sandbox.onlinephpfunctions.com/code/2caa5051d73a91e6b19dd30187354b597638c68c

    0 回复  |  直到 5 年前
        1
  •  3
  •   ALFA SantanaFire    5 年前

    使用regex PREG_OFFSET_CAPTURE 具体如下:

    function maximizeNumberRoundness($n) {
        $firstZero = strpos($n, "0");
        preg_match('/([^0])0*$/', $n, $match, PREG_OFFSET_CAPTURE);
    
        echo "first zero: " . $firstZero;
        echo "\r\n";
    
        $last_nonzero_index = strlen($n) - $match[1][1] - 1;
    
        echo "last non-zero: " . $last_nonzero_index;
    }
    
    maximizeNumberRoundness(902200100);
    

    输出:

    first zero: 1
    last non-zero: 2
    

    只要我正确理解您希望从 正确的 在绳子上。

        2
  •  1
  •   ArtisticPhoenix    5 年前

    这是正则表达式

    preg_match('/([^0])0*$/', $string, $match);
    echo $match[1];
    

    在这种情况下 902200100 输出为

    1
    

    Sandbox

    其他选择

    • strrpos-找到最右边出现的位置例如。 $string[strpos($string,'0')];

    另外,1不正确,因为我需要的是位置,而不是值。

    strrpos -注意 r 就像 strpos 但它发现最后一次发生不是第一次

    更新

    试试这样,现在我想我明白你想要什么了。

      var_export(preg_split('/(0)/', '902200100',-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));
    

    产量

    array (
      0 => '9',
      1 => '0',
      2 => '22',
      3 => '0',
      4 => '0',
      5 => '1',
      6 => '0',
      7 => '0',
    )
    

    Sandbox

    然后我会把它和 array_itersect($split, [0]) 等等

    array (
      1 => '0',
      3 => '0',
      4 => '0',
      6 => '0',
      7 => '0',
    )
    

    在这种情况下(注意键),其余的都是无关紧要的。如果你想让这个位置只有一个数字,那就用 str_split 然后相交

        3
  •  0
  •   Blackbam    5 年前

    只有一个可能的解决方案:

    $rev = strrev((string) $number);
    
    $pos = function() use ($rev) {
      for($i=0;$i<count($rev);$i++) {
        if(rev[$i] != "0") return $i;
      }
    };
    
    echo "last non-zero": $pos();
    
        4
  •  0
  •   Dean    5 年前

    试试这个。如果要经常调用此函数,应避免使用正则表达式。

    <?php
    
    function getLastCharacterThatIsntZero($number) {
        $characters = array_reverse(str_split((string)$number));
        foreach($characters AS $character) {
            if($character != "0") {
                return (int)$character;
            }
        }
        return false;
    }
    
    var_dump(getLastCharacterThatIsntZero(12345)); // returns 5
    var_dump(getLastCharacterThatIsntZero(123450)); // returns 5
    var_dump(getLastCharacterThatIsntZero(0)); // returns false