从字符串中提取数字 - 为啥在使用捕获组时会得到两个数组?
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
)
)
我想捕获像5528
和8992842
这样的数字。下面的代码不起作用。
/*
$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) 时会将数字四舍五入?