【问题标题】:How do I capture all the numeric substrings from the string?如何从字符串中捕获所有数字子字符串?
【发布时间】:2017-03-23 06:19:05
【问题描述】:

我的字符串如下所示:

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

【问题讨论】:

  • 如你所愿,只需 preg_match 然后告诉我,是否固定会有 3 个数字?

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


【解决方案1】:
<?php

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

输出:

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

)

【讨论】:

  • 非常感谢您的回答,但我只想使用 preg_match 而不是 preg_match_all
  • @mateors 要查找多个匹配项,您必须使用 preg_match_all
  • 我指的是这个网站regex101.com 他们说重复捕获组只会捕获最后一次迭代。如果您对数据不感兴趣,请在重复组周围放置一个捕获组以捕获所有迭代或使用非捕获组,所以我想应该有一个解决方案,您确定 preg_match_all 是唯一的解决方案吗?提前感谢您的帮助。
【解决方案2】:

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

输入

$response = "Response: 311768560
311768562
311768564";

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

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

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

方法#2preg_match_all() (Demo)

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

此方法非常直接、快速,并且需要最少的代码。如果说有什么缺点的话,那就是preg_match_all() 返回一个真|假结果并以多维数组的形式生成一个输出变量。为了修改此输出以满足您的一维需求,我在函数末尾放置了一个内联条件,它将所需的数据传递给 $array

方法#3preg_split() (Demo)

$array = preg_split('/\D+/', $response, 0, PREG_SPLIT_NO_EMPTY);

这个函数的行为就像explode() 一样,只是它使用了正则表达式的力量。该模式识别所有非数字子字符串并将它们用作“分隔符”并在每个子字符串上拆分字符串。对于您的输入,第一个分隔符是“响应:”,然后是换行符:“311768560”和“311768562”。 preg_split() 的美妙之处在于它直接提供了你要找的一维数组。

输出

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

如果这些方法中的任何一个无法满足您的实际用例,则可能是您的 $response 字符串与您在此处发布的示例数据差异太大。

【讨论】:

    【解决方案3】:

    使用 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 )
    

    【讨论】:

    • 谢谢,但我只需要使用 preg_match
    • 您已更改输入以适合您的方法。 $str 不能准确地表示 OP 的样本输入。
    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多