正则表达式以5位数分割(PHP)

时间:2014-09-12 16:30:38

标签: php regex parsing csv

我遇到了以下问题。

我想在特定的地方分割一个字符串。它曾用于处理csv文件。

以下情况:

我的CSV文件是这样的:

33333|'AB'|'01.01.2014'|'short'44444|'AB'|'01.01.2014'|'short'11111|'AB'|'01.01.2014'|'short'

这意味着:我在开头有一个包含5位数的ID,我想拆分这个字符串并将其解析成一个数组。我想使用preg_split,但我怎么能这样做?我认为匹配这部分:

'44444|

现在特别的愿望:我想把这5个数字放到我的数组中。所以我想访问部分,preg_split拼接 - 这可能吗?

非常感谢您提前

4 个答案:

答案 0 :(得分:1)

这就是你想要的吗?

$str = "33333|'AB'|'01.01.2014'|'short'44444|'AB'|'01.01.2014'|'short'11111|'AB'|'01.01.2014'|'short'";

$res = preg_split('/(\b\d{5}\|)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
print_r($res);

<强>输出:

Array
(
    [0] => 33333|
    [1] => 'AB'|'01.01.2014'|'short'
    [2] => 44444|
    [3] => 'AB'|'01.01.2014'|'short'
    [4] => 11111|
    [5] => 'AB'|'01.01.2014'|'short'
)

答案 1 :(得分:0)

你不一定需要正则表达式:

$array = explode('|', $your_csv_data);

将为您提供csv值的数组。这当然只有在管道字符不能出现在实际值中时才有效。如果您希望第一项作为数据集的键,则可以执行以下操作:

$key = array_shift($array);
$list_of_csv_datas[$key] = $array;

如果我误解你,请纠正我。

答案 2 :(得分:0)

我认为您正在尝试根据之前存在的边界将字符串拆分为5位数字。

<?php
$string="33333|'AB'|'01.01.2014'|'short'44444|'AB'|'01.01.2014'|'short'11111|'AB'|'01.01.2014'|'short'";
$regex = '~(?<!^)(?=\d{5})~';
$splits = preg_split($regex, $string);
print_r($splits);
?>

<强>输出:

Array
(
    [0] => 33333|'AB'|'01.01.2014'|'short'
    [1] => 44444|'AB'|'01.01.2014'|'short'
    [2] => 11111|'AB'|'01.01.2014'|'short'
)

答案 3 :(得分:0)

这实际上是一个解析问题,而不是正则表达式问题。 PHP有几个用于解析CSV数据的内置函数:

如果要将整行解析为数组,可以使用str_getcsv(),如下所示:

$csv = "33333|'AB'|'01.01.2014'|'short'44444|'AB'|'01.01.2014'|'short'11111|'AB'|'01.01.2014'|'short'";
$csvArray = str_getcsv($csv, "|", "'");
print_r($csvArray);

这给了你:

Array
(
    [0] => 33333
    [1] => AB
    [2] => 01.01.2014
    [3] => short44444
    [4] => AB
    [5] => 01.01.2014
    [6] => short11111
    [7] => AB
    [8] => 01.01.2014
    [9] => short
)

或者,如果您真的只想要第一列,那么您可以直到第一个|分隔符上的所有内容:

echo substr($csv, 0, strpos($csv, '|'));