用于在PHP中解析CSV的正则表达式

时间:2009-01-22 19:34:33

标签: php regex csv

我已经设法使用此正则表达式拆分CSV文件: “/,(=(?:?[^ \”]的 \ “[^ \”] \ “?!)的([^ \”] \“)) /“

但我最终得到了一个包含开头和结尾双引号的字符串数组。 现在我需要一个正则表达式来删除分隔符双引号的字符串。

据我所知,CSV格式可以用双引号封装字符串,并且所有已经成为字符串一部分的双引号都会加倍。例如:

我的“其他”猫

变为

“我的”“其他”“猫”

我基本上需要的是一个正则表达式,它将用一系列(N / 2 - 向下舍入)双引号替换N个双引号的所有序列。

还是有更好的方法吗? 提前谢谢。

6 个答案:

答案 0 :(得分:21)

有读取csv文件的功能:fgetcsv

答案 1 :(得分:4)

为什么在fgetcsv函数为你完成所有艰苦工作的时候,你还要用正则表达式来分割文件?

您可以传入分隔符和分隔符,它将检测要执行的操作。

答案 2 :(得分:2)

我同意其他人说你应该使用fgetcsv函数而不是正则表达式。正则表达式可能适用于格式正确的CSV数据,但如果CSV格式错误或损坏,正则表达式将无声地失败,可能会在此过程中返回虚假结果。

然而,问题特别是在初始拆分后剥离不需要的引号。提议的解决方案(到目前为止)太天真了,它只处理字段内的转义引号,而不是实际的分隔符。 (我知道OP没有询问这些,但是他们确实需要被移除,所以为什么不和其他人一样做?)这是我的解决方案:

$csv_field = preg_replace('/"(.|$)/', '\1', $csv_field);

此正则表达式匹配引号后跟任何字符或字符串末尾,并用第二个字符替换匹配的字符,如果是匹配的$,则替换为空字符串。根据规范,CSV字段可以包含行分隔符;这似乎没有发生太多,但如果需要,你可以将's'修饰符添加到正则表达式。

答案 3 :(得分:2)

对于那些不想使用正则表达式而不是fgetcsv的人。以下是如何使用正则表达式从csv创建html表的完整示例。

    $data = file_get_contents('test.csv');
    $pieces = explode("\n", $data);

    $html .= "<table border='1'>\n";
    foreach (array_filter($pieces) as $line) {

            $html .= "<tr>\n";
            $keywords = preg_split('/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $line,-1,PREG_SPLIT_DELIM_CAPTURE);

            foreach ($keywords as $col) {
                    $html .= "<td>".trim($col, '"')."</td>\n";
            }
            $html .= "</tr>\n";
    }
    $html .= "</table>\n";

答案 4 :(得分:2)

preg_split('/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $line,-1,PREG_SPLIT_DELIM_CAPTURE);

有“像”玩具“R”Us“的字符串里面的问题”

所以你应该使用:

preg_split('/'.$seperator.'(?=(?:[^\"])*(?![^\"]))/', $line,-1, PREG_SPLIT_DELIM_CAPTURE);

答案 5 :(得分:0)

这是我对它的快速尝试,虽然它只适用于字边界。

preg_replace('/([\W]){2}\b/', '\1', $csv)