使用PHP提取字符串中的第一个整数

使用PHP提取字符串中的第一个整数,php,preg-replace,Php,Preg Replace,考虑以下字符串: $strings = array( "8.-10. stage", "8. stage" ); 我想提取每个字符串的第一个整数,这样它就会返回 8 8 我尝试用preg_replace过滤掉数字,但它返回所有整数,我只想要第一个 foreach($strings as $string) { echo preg_replace("/[^0-9]/", '',$string); } 有什么建议吗 试试这个: $strings = array(

考虑以下字符串:

$strings = array(
    "8.-10. stage",
    "8. stage"
);
我想提取每个字符串的第一个整数,这样它就会返回

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

foreach($strings as $string)
{
    echo preg_replace("/[^0-9]/", '',$string);
}
有什么建议吗

试试这个:

$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);
$strings=数组(
“8-10.舞台”,
“8.阶段”
);
$res=array();
foreach($key=>$string形式的字符串){
preg_match(“/^(?P\d)/”,$string,$match);
$res[$key]=$match['number'];
}
回声“;
印刷品(港币);;
使用正则表达式的一种方便的(虽然性能上没有破纪录的)解决方案是:

echo substr($string, 0, strspn($string, "0123456789"));
假设输入中至少有一个数字,这将打印第一个数字

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

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

foreach($strings as $string){
    echo preg_replace("/([0-9]+)\./", "\\1",$string);
}

如果整数始终位于字符串的开头:

(int) strpbrk($string, "0123456789");
如果不是,则用于提取第一个非负数:

preg_split("/\D+/", "$string ")[1];
(int) preg_replace("/^\D+/", "", $string);
preg_match('/\d+/', "$string 0", $m)[0];
选择 这些一行程序基于和:

其中两个会在字符串中附加额外字符,这样空字符串或不带数字的字符串不会导致问题


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

如果您在PHP7+中有注意的话。

注意:只有变量应该在您的\u目录\u FILE.php的第\u行通过引用传递

使用此代码

$var = array_filter(preg_split("/\D+/", $string));
return reset($var);
将代码更改为

$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)
);

好好享受吧!向Ovasapov问好

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

目标整数可能不在字符串的开头(即使OP的问题只提供以整数开头的样本——其他研究人员可能需要更多的实用程序……就像我今天用这个页面结束的页面)。输入也可能不包含整数,或不包含前导/尾随非数字字符

下面是一个正则表达式,它有两个检查:

  • 它以字符串开头的所有非数字字符为目标——如果有数字,它将在第一个遇到的数字之前立即停止
  • 它匹配/使用遇到的第一个整数,然后在匹配/使用字符串其余部分中遇到的任何字符之前,立即忘记/释放它(使用
    \K
  • 我的代码段将根据字符串的质量进行0、1或2次替换

    代码:()

    输出:


    “重置”示例导致PHP严格通知。。。“严格标准:只能通过引用传递变量”如果我只想返回字母表,怎么做?但只适用于字符串开头有一位数字的数字,如果没有,后面的行将导致错误。
    (int)$string是一个很好的解决方案,我从未遇到过
    
    (int) strpbrk($string, "0123456789");
    
    preg_split("/\D+/", "$string ")[1];
    (int) preg_replace("/^\D+/", "", $string);
    preg_match('/\d+/', "$string 0", $m)[0];
    
    echo reset(array_filter(preg_split("/\D+/", $string)));
    
    $var = array_filter(preg_split("/\D+/", $string));
    return reset($var);
    
    $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',
    )