【问题标题】:Match a Comma that isn't within quotes匹配不在引号内的逗号
【发布时间】:2011-03-27 08:11:43
【问题描述】:

我正在尝试编写一个正则表达式,它允许我解析 excel 创建的 CSV 文件。我注意到,当您从 excel 导出 CSV 时,如果该字段是一个字符串,它将用引号括起来。如果该字符串本身包含引号,它将用引号转义每个引号!

我想要做的是将解析的每一行拆分为字段。鉴于上述情况,当逗号不在引号内时,我必须拆分。我的正则表达式很糟糕,那我该怎么做呢?

我可以用逗号分隔,但是如果它不在引号之间,我该怎么说??

$lines = file($toce_path);

foreach ($lines as $line) {

    $line_array = preg_split("/,/", $line);

    $test = "($line_array[0], $line_array[1], $line_array[2])";

    echo $test.'<br />';

} 

This question 和我的一模一样,但它不适用于 preg_split。 Preg_split 需要与 Perl 兼容的正则表达式语法。

感谢大家的帮助

【问题讨论】:

  • 是否可以改用合适的 CSV 解析器?
  • 另一个问题的正则表达式对我来说似乎与 Perl 兼容。如果它不起作用,我会感到惊讶。
  • @mmyers - 我不确定哪些可用?我确实尝试在 PHP 中找到一些东西,但我读到了一些 cmet,fgetcsv 不能很好地与 excel 创建的 CSV 配合使用。但我对此非常接近,我对正则表达式毫无希望。
  • @Dan - 我一直收到无定界符错误,但我只是用/ 将它包裹起来,它似乎正在工作!该死的。

标签: php regex


【解决方案1】:

不完全回答你的问题,但也许能解决你的问题:

你试过fgetcsv()str_getcsv()吗?

如果您处理 CSV 数据,他们是您最好的朋友。

【讨论】:

    【解决方案2】:

    此表达式适用于应该与 Perl 兼容的 .NET:(?&lt;!\"\w*),

    输入:some, "text, here" 仅在 some 之后的逗号上返回匹配项。

    【讨论】:

    • 这也将拆分为"multiple words, here",但"wont"split,here。有一些方法可以欺骗正则表达式在引号之间查找标记,但恐怕这不是一个好方法。
    【解决方案3】:

    为什么不用php的内置函数呢?

    http://php.net/manual/en/function.fgetcsv.php

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 1970-01-01
      • 2020-05-21
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多