【问题标题】:Extract first integer in a string with PHP用PHP提取字符串中的第一个整数
【发布时间】:2013-02-15 19:22:48
【问题描述】:

考虑以下字符串:

$strings = array(
    "8.-10. stage",
    "8. stage"
);

我想提取每个字符串的第一个整数,所以它会返回

8
8

我试图用 preg_replace 过滤掉数字,但它返回所有整数,我只想要第一个。

foreach($strings as $string)
{
    echo preg_replace("/[^0-9]/", '',$string);
}

有什么建议吗?

【问题讨论】:

    标签: php preg-replace


    【解决方案1】:

    如何过滤除第一个出现的整数以外的所有字符:

    目标整数可能不在字符串的开头(即使 OP 的问题仅提供以整数开头的样本 - 其他研究人员可能需要更多实用程序......比如我的页面今天使用此页面关闭)。输入也可能不包含整数,或者没有前导/没有尾随非数字字符。

    以下是一个正则表达式有两个检查:

    1. 它以字符串开头的所有非数字字符为目标——如果有的话,它会在第一个遇到的数字之前立即停止。
    2. 它匹配/使用第一个遇到的整数,然后立即忘记/释放它(使用\K),然后匹配/使用字符串其余部分中遇到的任何字符。

    我的 sn-p 将根据字符串的质量进行 0、1 或 2 次替换。

    代码:(Demo)

    $strings = [
        'stage', // expect empty string
        '8.-10. stage', // expect 8
        '8. stage', // expect 8
        '8.-10. stage 1st', // expect 8
        'Test 8. stage 2020', // expect 8
        'Test 8.-10. stage - 2020 test', // expect 8
        'A1B2C3D4D5E6F7G8', // expect 1
        '1000', // expect 1000
        'Test 2020', // expect 2020
    ];
    
    var_export(
        preg_replace('/^\D+|\d+\K.*/', '', $strings)
    );
    

    输出:

    array (
      0 => '',
      1 => '8',
      2 => '8',
      3 => '8',
      4 => '8',
      5 => '8',
      6 => '1',
      7 => '1000',
      8 => '2020',
    )
    

    【讨论】:

      【解决方案2】:

      使用正则表达式的一个方便(尽管性能上没有破纪录)的解决方案是:

      $string = "3rd time's a charm";
      
      $filteredNumbers = array_filter(preg_split("/\D+/", $string));
      $firstOccurence = reset($filteredNumbers);
      echo $firstOccurence; // 3
      

      假设输入中至少有一个数字,这将打印第一个。

      非数字字符将被完全忽略,除了它们被视为分隔数字之外,这意味着第一个数字可以出现在输入中的任何位置(不一定在开头)。

      如果您只想考虑出现在字符串开头的数字,则不需要正则表达式:

      echo substr($string, 0, strspn($string, "0123456789"));
      

      【讨论】:

      • “reset”示例导致 PHP Strict Notices...“Strict Standards: Only variables should be pass by reference”
      • 如果我只想返回字母表怎么办?
      • @xjshiya 在这里查看这个答案stackoverflow.com/questions/6067592/…
      【解决方案3】:

      如果您在 PHP 7 + 中有通知

      注意:只有变量应该在第 LINE_NUMBER 行的 YOUR_DIRECTORY_FILE.php 中通过引用传递

      通过使用此代码

      echo reset(array_filter(preg_split("/\D+/", $string)));
      

      将代码更改为

      $var = array_filter(preg_split("/\D+/", $string));
      return reset($var);
      

      尽情享受吧!最好的问候奥瓦萨波夫

      【讨论】:

        【解决方案4】:

        如果整数总是在字符串的开头:

        (int) $string;
        

        如果不是,则strpbrk 可用于提取第一个非负数:

        (int) strpbrk($string, "0123456789");
        

        替代品

        这些单行代码基于preg_splitpreg_replacepreg_match

        preg_split("/\D+/", "$string ")[1];
        (int) preg_replace("/^\D+/", "", $string);
        preg_match('/\d+/', "$string 0", $m)[0];
        

        其中两个将额外字符附加到字符串,因此空字符串或没有数字的字符串不会导致问题。

        请注意,这些替代解决方案仅用于提取非负整数。

        【讨论】:

        • (int) $string; 是一个不错的解决方案,我从来没有遇到过
        【解决方案5】:
        preg_match('/\d+/',$id,$matches);
        $id=$matches[0];
        

        【讨论】:

          【解决方案6】:
          foreach($strings as $string){
           if(preg_match("/^(\d+?)/",$string,$res)) {
             echo $res[1].PHP_EOL;
           }
          }
          

          【讨论】:

            【解决方案7】:
            foreach($strings as $string){
                echo preg_replace("/([0-9]+)\./", "\\1",$string);
            }
            

            【讨论】:

              【解决方案8】:

              试试这个:

              $strings = array(
                  "8.-10. stage",
                  "8. stage"
              );
              
              $res   = array();
              foreach($strings as $key=>$string){
                preg_match('/^(?P<number>\d)/',$string,$match);
                $res[$key] = $match['number'];
              }
              
              echo "<pre>";
              print_r($res);
              

              【讨论】:

              • 但只适用于字符串开头有一个数字的数字,如果没有,后面的行会导致错误。
              猜你喜欢
              • 2010-12-28
              • 1970-01-01
              • 1970-01-01
              • 2014-06-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-11-02
              • 2020-02-12
              相关资源
              最近更新 更多