如何从字符串中捕获所有数字子字符串?

时间:2017-03-23 06:19:06

标签: php regex preg-match-all numeric substring

我的字符串如下所示:

Response: 311768560
311768562
311768564

我试过了:

$success_pattern="Response: ((\d+)[\n])*"; 
$response="Response: 311768560\n311768562\n311768564\n311768566";
preg_match("/$success_pattern/i", $response, $match);

输出:

Array ( 
    [0] => Response: 311768560 311768562 311768564
    [1] => 311768564
    [2] => 311768564
)

我需要一个包含所有数字的数组作为输出,如:

array('311768560','311768562','311768564');

3 个答案:

答案 0 :(得分:0)

<?php

$string="Response: 311768560 311768562 311768564";
preg_match_all("/[\d]+/", $string, $matches);
print_r($matches);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => 311768560
            [1] => 311768562
            [2] => 311768564
        )

)

答案 1 :(得分:0)

尽量不要对preg_match()等特定功能过于依赖。 PHP提供了几种生成所需输出的方法。我将向您展示三种不同的方法:

<强>输入

$response="Response: 311768560
311768562
311768564";

方法#1 explode() substr()strpos()Demo

$array=explode("\r\n",substr($response,strpos($response,' ')+1));

*请注意,此方法假定第一个字符串(Response)是唯一不需要的子字符串,并且它始终是第一个。此外,根据您的编码环境,可能不需要\r。这可能是我的方法列表中最快的,因为它不使用正则表达式,但它确实需要3个函数调用和一个增量 - 更不用说它可能对你的实际用例来说太字面了。

方法#2 preg_match_all()Demo

$array=preg_match_all('/\d+/',$response,$out)?$out[0]:[];

此方法非常直接,快速,并且只需要最少的代码。如果存在任何缺点,则preg_match_all()返回true | false结果并以多维数组的形式生成输出变量。要修改此输出以满足您的一维要求,我会在函数末尾放置一个内联条件,将所需数据传递给$array

方法#3 preg_split()Demo

$array=preg_split('/[^\d]+/',$response,null,PREG_SPLIT_NO_EMPTY);

此函数的行为与explode()类似,只不过它具有正则表达式的强大功能。该模式标识所有非数字子串并将它们用作“分隔符”并在每个子串上拆分字符串。对于您的输入,第一个分隔符是“Response:”,然后是“311768560”和“311768562”之后的换行符。 preg_split()的美妙之处在于它直接提供了您正在寻找的一维数组。

<强>输出

无论您尝试使用上述哪种方法,都会收到相同的正确输出:$array=array('311768560','311768562','311768564');

如果这些方法中的任何一种方法都失败了您的实际用例,那么您的$response字符串可能与您在此处发布的示例数据有太大不同。

答案 2 :(得分:-1)

使用Array_shift()函数

<?php
$str = "Response: 311768560 311768562 311768564";
$s = explode(" ",$str);
$p = array_shift($s);
print_r($s);
?>

输出

Array (
    [0] => 311768560
    [1] => 311768562
    [2] => 311768564 )