2,"35205702,2505907","0","15","0",125,2678,2009-10-12 13:49:00,2009-11-13 14:54:00,2009-10-13 02:45:00
把上面的字符串以(,)分开,但是如果有“则表示,是子字符串里面的,则不分开,
那么上面的字符串最后分开后是
2  "35205702,2505907"   "0"   "15"   "0"   125   2678   2009-10-12 13:49:00   2009-11-13 14:54:00   2009-10-13 02:45:00不管你用正则,还是其它方法,只要能分开就是好方法
当然,请不要为了分开这玩意,写一页代码。

解决方案 »

  1.   

    手册中:
    <?php
    $str = 'one|two|three|four';// positive limit
    print_r(explode('|', $str, 2));// negative limit (since PHP 5.1)
    print_r(explode('|', $str, -1));
    ?> 
      

  2.   

    $str=<<<STR
    2,"35205702,2505907","0","15","0",125,2678,2009-10-12 13:49:00,2009-11-13 14:54:00,2009-10-13 02:45:00
    STR;
    $str = preg_replace("/(\"[^\"]+)(,)([^\"]+)\"/", "\\1$\\3", $str);
    $str = str_replace(",", " ", $str);
    echo str_replace("$", ",", $str);
    思路就是先用正则,将""号里的逗号转成其它的字符,等替换或者分割以后再转回来.
      

  3.   

    $text = <<< TEXT
    2,"35205702,2505907","0","15","0",125,2678,2009-10-12 13:49:00,2009-11-13 14:54:00,2009-10-13 02:45:00
    TEXT;
    preg_match_all('/(".+"|.+)(?:,|$)/U', $text, $r);
    echo join(' ', $r[1]);2 "35205702,2505907" "0" "15" "0" 125 2678 2009-10-12 13:49:00 2009-11-13 14:54:00 2009-10-13 02:45:00我觉得这种串一般不会出现在程序代码中,而存在于文件中。
    因此实用的写法是用fgetcsv函数读取。模拟代码如下
    $text = <<< TEXT
    2,"35205702,2505907","0","15","0",125,2678,2009-10-12 13:49:00,2009-11-13 14:54:00,2009-10-13 02:45:00
    TEXT;$fp = tmpfile();
    fwrite($fp, $text);
    fseek($fp, 0);$ar = fgetcsv($fp);
    print_r($ar);
    Array
    (
        [0] => 2
        [1] => 35205702,2505907
        [2] => 0
        [3] => 15
        [4] => 0
        [5] => 125
        [6] => 2678
        [7] => 2009-10-12 13:49:00
        [8] => 2009-11-13 14:54:00
        [9] => 2009-10-13 02:45:00
    )
      

  4.   

    楼上的聪明过人fgetcsv -- 从文件指针中读入一行并解析 CSV 字段
    说明
    array fgetcsv ( int handle [, int length [, string delimiter [, string enclosure]]] )
    handle
    一个由 fopen()、popen() 或 fsockopen() 产生的有效文件指针。 length (可选)
    必须大于 CVS 文件内最长的一行。在 PHP 5 中该参数是可选的。如果忽略(在 PHP 5.0.4 以后的版本中设为 0)该参数的话,那么长度就没有限制,不过可能会影响执行效率。 delimiter (可选)
    设置字段分界符(只允许一个字符),默认值为逗号。 enclosure (可选)
    设置字段环绕符(只允许一个字符),默认值为双引号。该参数是在 PHP 4.3.0 中添加的。 
    和 fgets() 类似,只除了 fgetcsv() 解析读入的行并找出 CSV 格式的字段然后返回一个包含这些字段的数组。 fgetcsv() 出错时返回 FALSE,包括碰到文件结束时。 
    原来分隔符也可以自定义..
    fgetcsv 会对""里面的值做为字符串处理,所以分割不受影响,谢谢,我也学到了一些东西.谢谢了
      

  5.   


    <pre>
    <?php
    $str = '2,"35205702,2505907","0","15","0",125,2678,2009-10-12 13:49:00,2009-11-13 14:54:00,2009-10-13 02:45:00';
    preg_match_all('/(?<=^|,)("?)[^"]*\\1(?=,|$)/U',$str,$out);
    print_r($out[0]);
    ?>
    </pre>