Php preg_split会产生意外的结果

Php preg_split会产生意外的结果,php,regex,Php,Regex,我使用PHPfile命令将文件作为数组读入。数组的每一行都包含数字,如“0 0 0 1 22 5 1 71”等。应该有1024组这些非空白字符,我正在尝试将它们提取到数组中 // $lines contains each line from file(...) foreach ($lines as $i => $value) { $matches = preg_split('/\s*(\d*)\s*/', $lines[$i]); echo count($matches);

我使用PHP
file
命令将文件作为数组读入。数组的每一行都包含数字,如“0 0 0 1 22 5 1 71”等。应该有1024组这些非空白字符,我正在尝试将它们提取到数组中

// $lines contains each line from file(...)

foreach ($lines as $i => $value) 
{
  $matches = preg_split('/\s*(\d*)\s*/', $lines[$i]);
  echo count($matches);

}
然而,当我运行这个程序时,我得到的是1026,而不是1024。有什么不对劲?当我使用

 $matches = preg_split('/\s*(\d*)/', $lines[$i]);

我得到1027。你根本不需要正则表达式。使用可能会更快。要在适当的位置修改数组,只需通过引用传递到
foreach
(但要与该实践相关,然后使用
unset


正则表达式需要匹配要拆分的分隔符字符串。您的代码可能出错,因为它试图在分隔符中包含数字。更不用说,
/\s*\d*\s*/
几乎可以匹配任何空格字符和数字的组合

$input = '   0 0 0 1 22 5 1 71 ';
var_dump(preg_split('/\s+/', $input, -1, PREG_SPLIT_NO_EMPTY));
输出:

array(8) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "0"
  [2]=>
  string(1) "0"
  [3]=>
  string(1) "1"
  [4]=>
  string(2) "22"
  [5]=>
  string(1) "5"
  [6]=>
  string(1) "1"
  [7]=>
  string(2) "71"
}

发布所讨论的
$行[$i]
var\u dump
,这样它是可复制的,您将更容易得到答案。您可以尝试
\s*(\d+)\s*
\b(\d+)\b
并查看它是否有区别。空值在字符串计数的开始和结束处匹配。但是你用错了函数。您不希望
拆分
,而是希望
匹配
<代码>预匹配所有(“/\d+/”,$input,$MATCHS);var_dump($matches[0])谢谢-我已经忘记了所有关于这个函数的事情(而且我觉得我的正则表达式一开始有点不太合适)。现在可以享受了!我试过了,但是数组中的第一个字符前面有三个空格(这在我的序言中没有显示),我需要能够去掉这三个空格以及单个空格。我做了一次搜索,发现了一个名为“mulitpleexplode”的东西,你可以在一个数组中指定多个delimeter,但这不起作用。你可以先修剪值。
array(8) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "0"
  [2]=>
  string(1) "0"
  [3]=>
  string(1) "1"
  [4]=>
  string(2) "22"
  [5]=>
  string(1) "5"
  [6]=>
  string(1) "1"
  [7]=>
  string(2) "71"
}