【问题标题】:Get substring from specific position to last occurring number in string获取从特定位置到字符串中最后出现的数字的子字符串
【发布时间】:2012-05-14 10:22:53
【问题描述】:
$str = "234 567 some text following";

如何获取字符串中第三个字符到最后一个数字的子字符串?

$positionOfNewLeadingCharacter = 3;

在上面的示例中,我希望返回子字符串4 567,而不是从第三个字符到字符串末尾。 7 是样本字符串中最后出现的数字。

我的实际应用程序中的字符串可能是文本和数字的混合体。我需要将子字符串从已知位置提取到最后出现的数字的位置。

【问题讨论】:

    标签: php text-extraction


    【解决方案1】:

    你想:

    1. 通过指定应该成为新的第一个字符的字符的偏移量来从字符串的前面删除字符
    2. 从字符串末尾删除零个或多个非数字字符。

    这当然可以通过一个 preg_match() 调用来完成,但是该模式的可读性不是很好。

    使用substr() 是删除不需要的前导字符的好方法——只要确保起始偏移量永远不会小于零,否则您会得到意想不到的结果。我还没有在我的 sn-p 中内置多字节支持。

    要从第 3 个字符开始,必须从第 2 个偏移量减去 1。

    至于从字符串末尾修剪零个或多个 (*) 非数字字符 (\D),请使用字符串末尾锚点 ($)。

    代码:(Demo)

    $str = "234 567 some text following";
    
    $start = 3;
    
    var_export(
        preg_replace(
            '/\D*$/',
            '',
            substr($str, max($start, 1) - 1)
        )
    );
    

    输出:

    '4 567'
    

    更丑的preg_match()方式:(Demo)

    var_export(
        preg_match(
            '/.{' . max($start - 1, 0) . '}\K.*\d/',
            $str,
            $match
        )
        ? $match[0]
        : 'no match'
    );
    

    【讨论】:

      【解决方案2】:
      <?php
        $subStr = substr($str, 2);
      ?>
      

      默认情况下,长度(第三个参数)在省略时将默认为字符串的末尾。请注意,字符从 0 开始,因此第三个字符将位于位置 2。

      【讨论】:

        【解决方案3】:

        您可以通过在正则表达式中使用negative lookahead 来做到这一点。

        <?php
            $lastNumber = getLastNumber("234 567 some text following");
            var_dump($lastNumber);
        
            function getLastNumber($string) {
                preg_match("/[0-9](?!.*[0-9])/", $string, $match);
                if (!empty($match[0])) return $match[0];
                return false;
            }
        ?>
        

        编辑:对不起,我看错了;以为你想要最后一个独立号码。

        双重编辑:这似乎可以满足您的需求

        <?php
            $string = substr("234 567 some text 123 22 following", 2);
            preg_match("/[0-9 ]+/", $string, $matches);
            if (!empty($matches)) {
                $number = intval(str_replace(" ", "", $matches[0]));
                var_dump($number);
            }
        ?>
        

        因为它返回“4567”。当然,如果您想要保留空间,只需使用 $matches[0] 而不是 $number

        【讨论】:

          【解决方案4】:

          试试这个:

          substr($str,2,strlen($str));
          

          编辑(新答案):

          此代码正在运行:

          $str = preg_replace( "/\D/", "", $str);
          echo substr($str,2);
          

          【讨论】:

          • 是的,我只是想以防万一因为问题不清楚.. ty
          • @jbduzan 但他想要它到最后一个字符!他想要最后一个数字
          【解决方案5】:

          你应该使用 substr 函数

          substr($str, 2);
          

          编辑:

          使用正则表达式

          $pattern = '/^[0-9]+/';
          preg_match($pattern, substr($str, 2), $matches, PREG_OFFSET_CAPTURE, 3);
          print_r($matches);
          

          编辑2: 经过测试,它可以工作

          $pattern = '/^([0-9][ ]*)+/';
          preg_match($pattern, substr($str, 2), $matches);
          print_r($matches);
          

          编辑3: 没有看到你的最后一个编辑,正在构建一个新的^^

          编辑4:

          $str = "234 567 some text 123 22 following 12 something";
          $pattern = '/^([ ]*([0-9][ ]*)*([a-zA-Z][ ]*)*[0-9]*)*[0-9]/';
          preg_match($pattern, substr($str, 2), $matches);
          echo $matches[0];
          

          给我4 567 some text 123 22 following 12

          这是你所期待的吗?

          编辑 5:

          又来了一个^^

          '/^([0-9 :._\-]*[a-zA-Z]*[:._\-]*)*[0-9]/'
          

          【讨论】:

          • 我不确定这是否很有用 - 他想要最后一个数字,而不是最后一个字符
          • 如果你尝试像“03:30 -11.6 31.4 03:40 Back to the future”这样的字符串,它就不起作用。字符串可以包含字符和数字的任意混合。
          • 你应该说,然后建立一个新的:D
          【解决方案6】:

          我只是偶然发现了这一点,并认为我会分享我的解决方案。

          <?php
          $string = "234 567 some text following";
          $start = 2;
          if(preg_match_all('/\d+/', $string, $sub)){
              $lastNumber = end($sub[0]);
              $newString = substr($string,$start, strrpos($string, $lastNumber) + strlen($lastNumber) - $start);
          }
          echo $newString;
          

          这一行获取字符串中的所有数字

          if(preg_match_all('/\d+/', $string, $sub))
          

          这里我们获取最后一个数字

          $lastNumber = end($sub[0]); 
          

          然后我们找到最后一次出现的数字,使用strrpos 以防最后一个数字多次出现。然后,使用该位置提取从起始位置到最后一个数字的子字符串:

          $newString = substr($string,$start, strrpos($string, $lastNumber) 
                       + strlen($lastNumber) - $start);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-28
            • 2021-08-22
            • 1970-01-01
            • 2011-10-06
            • 1970-01-01
            • 2012-04-02
            相关资源
            最近更新 更多