首页 文章

如何在php中优化这个parsing-csv regexp来解析字符串值中的逗号?

提问于
浏览
-1

我在这个问题中使用了joker83的答案:Regular expression for parsing CSV in PHP但是我发现它无法解析其字段值正确包含逗号的csv字符串 . 是否可以优化此正则表达式来解决此问题?

Explanation of the pattern from joker83: /,(?=(?:[^"])*(?![^"]))/ .

  1. ,(?=x) 表示遵循模式x的逗号 .
  2. [^\"] 表示除双引号外的某些字符 .
  3. (?:[^\"]) 表示匹配括号ed子模式,但不将其捕获到匹配的结果数组中 .
  4. * 表示指定模式的0或更多 .
  5. (x)* 表示模式x的0或更多 .
  6. y?![^\"] 表示 y 不遵循某些字符而不是双引号(即匹配dobule引号之后的y)
    7.整个含义是匹配双引号后面的逗号(其中*表示零)或匹配除双引号之外的一个或多个字符后面的逗号,这些字符遵循双引号 .

如您所见,如果csv字符串是 120,"I love ""Lexi Belle"", ""Proxy Paige""","good stuff" ,那么当在preg_split中应用此regexp时,我们将得到4个字段(即 120 """I Love Lexi Bell"" ""Proxy Piage""" ** "good stuff"** )而不是正确的3个字段 .

Note: 我升级到新版本,因为我花了很多时间来安装可以在Windows上读取Oracle 8i的oci8 . 我无法在新版本的PHP中再次正确安装它们 .
Note: 我无法使用fgetcsv(),因为输入csv文件在csv字符串中包含LF代码,而fgetcsv()将在该字段的中间分割换行符 .

2 回答

  • 0

    你可以使用这个正则表达式:

    /,(?=([^\"]*\"[^\"]*\")*[^\"]*$)/
    

    可以从此stackoverflow条目Java: splitting a comma-separated string but ignoring commas in quotes找到(但对于java) .

    在你的字符串上它给出:

    array(3) {
      [0]=>
      string(3) "120"
      [1]=>
      string(31) ""I love Lexi Bell, Proxy Paige""
      [2]=>
      string(12) ""good stuff""
    }
    

    请注意,您仍然可以使用“” .

  • 0

    你为什么不用str_getcsv

    $string = '120,"I love Lexi Bell, Proxy Paige","good stuff"';
    $parsedCsv = str_getcsv($string);
    print_r($parsedCsv);
    

相关问题