在空格上拆分字符串,但使用正则表达式在1字段中允许空格

时间:2011-04-20 12:58:07

标签: php regex

这是以下帖子的后续内容: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^7si erra007^7si er ra007^7。它会知道它是第5个字段,因为它是唯一一个包含a-zA-Z字符的字段。它将知道字段5的结束位置,因为字段6仅包含0-9个字符。

感谢。

2 个答案:

答案 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,在几个字符串上测试它并让我知道。