将在字符串中找到的数字存储在数组中 preg_match

store numbers found in a string in a an array with preg_match

我需要检测在字符串中找到数字的次数。如果字符串是 "1 ssdsdsd 2" 我需要一个包含 [1,2] 的数组。如果字符串是 "1 a",我需要一个数组,例如:[1]

通过以下尝试,我很接近了,但最终我得到了重复的数字。预匹配似乎更适合我的需要,但也可以重复匹配。

知道这是为什么吗?我很感激有关如何完成此任务的任何建议。

输入

  preg_match_all("/([0-9]+)/", trim($s), $matches); //$s = "1 2", output below
  //preg_match("/([0-9]+)/", trim($s), $matches); //$s = "1 .", outputs [1,1]

输出

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
        )
    [1] => Array
        (
            [0] => 1
            [1] => 2
        )
)

删除捕获组,

preg_match_all("/[0-9]+/", trim($s), $matches);

matches数组的第一个元素是正则表达式的全匹配,第二个元素是捕获组。

您可以选择删除所有非数字字符并获得 strlen()

echo strlen(preg_replace('/[^0-9]/', '', '1 ssdsdsd 2')); // 2 digits
echo strlen(preg_replace('/[^0-9]/', '', '1 ssd324sd567s.d6756 2')); // 12 digits
echo strlen(preg_replace('/[^0-9]/', '', '123456789')); // 9 digits

如果你知道 PHP 字符串字符可以通过它们的索引位置访问,那么你可以使用类似的东西:

echo preg_replace('/[^0-9]/', '', '9 ssdsdsd 5')[0]; // outputs 9 because the resulting string is '95' and position zero's value is 9

preg_split() 是这项工作的理想工具,因为它将 return 平面索引数字数组。

使用 \D+ 分解出现的一个或多个非数字字符。使用函数标志确保输出数组中没有空元素——这消除了提前 trim 的需要。

代码:(Demo)

var_export(
    preg_split(
        '/\D+/',
        $s,
        0,
        PREG_SPLIT_NO_EMPTY
    )
);