Php preg_split会产生意外的结果
我使用PHPPhp 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);
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"
}