这是以下帖子的后续内容:Regex for splitting params out using preg_match
我有这个字符串1 0 61 12345678 sierra007^7 0 0 123.123.123.123:524 26429 25000
,我需要获取每个元素。有人建议我使用explode这是一个很简单的解决方案,但现在我需要在其中一个字段中允许空格。
其他人发布了这个正则表达式:
/^([-0-9]+)\s+([-0-9]+)\s+([-0-9]+)\s+([-0-9]+)\s+(\S+)\s+([-0-9])\s+([-0-9]+)\s+([-0-9.:]+)\s+([-0-9.]+)\s+([-0-9.]+)/mx
这会做其他所有事情,我想知道是否可以修改它以允许字段5中的空格(sierra007^7
)。我可以提供的唯一建议是,在字段5之前和之后,其余字段始终是数字(或您可以看到的冒号)。这可能是1个正则表达式语句还是我需要在PHP中解析它并捏造它一起?
编辑:例如,字段5可以是sierra007^7
或si erra007^7
或si er ra007^7
。它会知道它是第5个字段,因为它是唯一一个包含a-zA-Z字符的字段。它将知道字段5的结束位置,因为字段6仅包含0-9个字符。
感谢。
答案 0 :(得分:4)
为什么不像其他线程一样使用explode。并计算数组中的项目数。如果数组中有更多项目,则将项目5 +任何数字放在一起再次与implode ... 例如。你的正常行有10个项目。如果结果爆炸有15个项目,那么:
implode(" ",array_slice($array,5,(count($array)-10)));
答案 1 :(得分:3)
如果字段数永远不会改变,并且每个字段总是有值,则可以使用以下代码执行此操作:
$fields = explode (' ', $str);
$defaultNumFields = 10;
if (count($fields) > $defaultNumFields) {
for ($i = 5; $i < (count($fields) - $defaultNumFields) + 5; $i++) {
$field[4] .= ' '.$field[$i];
unset($field[$i]);
}
}
$fields = array_values($fields);
应该这样做。我可能计算错误,您可能需要将+4更改为+5,在几个字符串上测试它并让我知道。