从字符串中提取数字 - 为啥在使用捕获组时会得到两个数组?

Posted

技术标签:

【中文标题】从字符串中提取数字 - 为啥在使用捕获组时会得到两个数组?【英文标题】:Extracting numbers from string - Why do I get two arrays when using a capture group?从字符串中提取数字 - 为什么在使用捕获组时会得到两个数组? 【发布时间】:2016-12-22 06:06:48 【问题描述】:

我正在尝试从混合字符串中提取数字。

<?php
$string = "c <a data-player-id=\"5528\" href=\"/players/5528-ga-name--5406546\" target=\"_self\">GA Name</a> b <a data-player-id=\"8992842\" href=\"/players/8992842-chandran-win--123345\" target=\"_self\">C Win</a>";

//preg_match_all('!\d+!', $string, $matches);
//preg_match_all('/data-player-id=\"(\d+)/', $string, $matches);
preg_match_all('/\/players\/(\d+)/', $string, $matches);
print_r($matches);

?>

但它会产生 2 个数组:

Array
(
[0] => Array
    (
        [0] => /players/5528
        [1] => /players/8992842
    )

[1] => Array
    (
        [0] => 5528
        [1] => 8992842
    )

)

我想捕获像55288992842 这样的数字。下面的代码不起作用。

 /*
 $zero = $matches[0];
 $one = $matches[1];
 $two = $matches[2];

 echo $zero;
 echo $one;
 echo $two;
 */

编辑: 知道为什么它会返回 2 个数组吗? array[1]里面的物品可以统计吗?

【问题讨论】:

echo $matches[1][0];echo $matches[1][1]; 如前所述,原因是您使用capturing group 进行提取。 $matches[1] 始终包含第一个带括号的组(捕获组)的匹配项,$matches[0] 包含完整的模式匹配项。通过使用报告匹配的开头\K which resets 可以在不捕获组的情况下执行此操作,因此仅返回$matches[0] see this demo at regex101 中的数字。要计算它们,只需使用 count($matches[0]) 【参考方案1】:

尝试这样的事情。

<?php
$string = "c <a data-player-id=\"5528\" href=\"/players/5528-ga-name--5406546\" target=\"_self\">GA Name</a> b <a data-player-id=\"8992842\" href=\"/players/8992842-chandran-win--123345\" target=\"_self\">C Win</a>";

preg_match_all('!\d+!', $string, $matches);

$arr = array_unique($matches[0]);

// For Count items...
$count = count($arr);
echo $count;

foreach($arr as $match)

    echo $match."<br />";

?>

输出

5528

5406546

8992842

123345

【讨论】:

知道为什么它会返回到 2 数组,也可以计算数组 [1] 中的项目吗? $match[0] 包含匹配完整模式的字符串数组,而 $match[1] 包含由标签包围的字符串数组。使用 count($arr) 函数计算项目数【参考方案2】:

您可以使用foreach 循环打印$matches[1] 中找到的所有值

试试

$string = "c <a data-player-id=\"5528\" href=\"/players/5528-ga-name--5406546\" target=\"_self\">GA Name</a> b <a data-player-id=\"8992842\" href=\"/players/8992842-chandran-win--123345\" target=\"_self\">C Win</a>";


preg_match_all('/\/players\/(\d+)/', $string, $matches);
//print_r($matches);


foreach($matches[1] as $match)

    echo $match."<br />";

output

更新 1

是的,您可以使用count() 计算在$matches[1] 中找到的元素

$total_matches = count($matches[1]);
echo $total_matches;

【讨论】:

谢谢。知道为什么它会返回 2 个数组吗? 可以统计array[1]中的项目吗? @DilDilshan 是的,这是可能的。请在我的回答中查看更新 1 在我的情况下,如何在

以上是关于从字符串中提取数字 - 为啥在使用捕获组时会得到两个数组?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:如何在捕获单个组时匹配整个字符串 [重复]

为啥 C# 中的数字格式字符串在不使用小数 (F0) 时会将数字四舍五入?

为啥我在使用 useEffect 从区块链获取数据时会得到一系列 Promise?

使用正则表达式从字符串中提取数字和符号

正则表达式中的命名捕获组

为啥 Real Studio 在捕获异常时会中断?