【问题标题】:Regular Expression to split at number with 5 digits (PHP) [closed]正则表达式以 5 位数字拆分(PHP)[关闭]
【发布时间】:2014-09-12 16:30:37
【问题描述】:

我遇到了以下问题。

我想在特定位置拆分字符串。它用于处理 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 拼接的部分 - 这可能吗?

非常感谢您

【问题讨论】:

  • 文件中没有换行符吗?
  • 结果数组长什么样?
  • @user2674202 也可以看到,if this helps

标签: php regex parsing csv


【解决方案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'
)

【讨论】:

    【解决方案2】:

    这里不一定需要正则表达式:

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

    会给你一个 csv 值的数组。这当然只有在管道字符不能出现在实际值中时才有效。如果您希望第一项作为数据集的键,您可以这样做:

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

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

    【讨论】:

      【解决方案3】:

      我认为您正在尝试根据之前存在的边界将字符串拆分为 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'
      )
      

      【讨论】:

        【解决方案4】:

        这真的是解析问题,不是正则表达式问题。 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, '|'));
        

        【讨论】:

          猜你喜欢
          • 2019-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多