【发布时间】:2018-01-23 12:12:46
【问题描述】:
我目前正在导入 CSV 数据,需要将其全部整理好。
较小的示例数据如下。
"Name","Address"
"John Doe","5111 Fury Rd
Santa Cruz"
"Jane Doe","321 Tess St Texas"
"Josh Doe","653 1st St
Orlando Florida
United States"
如您所见,我们需要在引号之外的换行符处进行拆分,因为 str_getcsv 不是多行的。
我最初使用过这个表达方式。
$lines = preg_split('/[\r\n]{1,2}(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/',$data);
但是当字符串中的字符数超过 XXXX 时,preg_split 就搞砸了。
所以目前使用 preg_match_all 但需要正则表达式选择器的问题。
preg_match_all('/^(.*?)[\r\n]{1,2}(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $data, $matches);
目前只匹配第一个实例。
Array(
[0] => Array ( [0] => "Name","Address")
[1] => Array ( [0] => "Name","Address")
)
有什么线索可以让它返回数组中的所有数据?
【问题讨论】:
-
这是一串数据吗?
-
我正在导入它的 CSV 数据,所以它应该是 1 个巨大的字符串,每个条目(行)用换行符分隔。
-
^没有m修饰符只匹配第一行(字符串的开头)。 -
你说得对。完全错过了!
-
也许
/^"([^"]+?)","([^"]+?)"$/m对你有用?这也假设您的字符串永远不会在其中转义引号,并且您只有 2 个匹配项
标签: php regex csv preg-match-all preg-split