前段时间问了一个问题见http://community.csdn.net/Expert/topic/5536/5536520.xml?temp=.285412我用的是下面的方法拆分的
<?php
$v="'b9',NULL,'h,3,he,p',1,'d-0',1,11,'4d'";
$pattern = "/('[^']*')|,?([^',]+),?/";
$res = array();
if (preg_match_all($pattern, $v, $match))
{
foreach($match[1] as $key=>$val)
{
if ($val == '')
{
$res[$key] = $match[2][$key];
}
else
$res[$key] = $val;
}
}
echo '<pre>';
print_r($res);
?>
原先没想到\'的问题,如果单引号当中存在\'也作为一个值的话应该怎么做?
如:将$v="'b9',NULL,'h,3,he,psaf\'sdfsd,dsf',1,'d-0',1,11,'4d'";
拆分为
Array
(
    [0] => 'b9'
    [1] => NULL
    [2] => 'h,3,he,psaf\'sdfsd,dsf'
    [3] => 1
    [4] => 'd-0'
    [5] => 1
    [6] => 11
    [7] => '4d'
)

解决方案 »

  1.   

    <?php
    $v="'b9',NULL,'h,3,he,psaf\'sdfsd,dsf',1,'d-0',1,11,'4d'";
    $pattern = "/('.*?(?<![\\\\])')|,?([^,]+),?/";
    $res = array();
    if (preg_match_all($pattern, $v, $match))
    {
    foreach($match[1] as $key=>$val)
    {
    if ($val == '')
    {
    $res[$key] = $match[2][$key];
    }
    else
    $res[$key] = $val;
    }
    }
    echo '<pre>';
    print_r($res);
    ?>
      

  2.   

    <?php
    $v="'b9',NULL,'he,p',1,'d-0',1,11,'4d'";
    $arr=eval('return array('.$v.');');
    print_r($arr);
    ?>
    输出:
    Array
    (
        [0] => b9
        [1] => 
        [2] => he,p
        [3] => 1
        [4] => d-0
        [5] => 1
        [6] => 11
        [7] => 4d
    )
    是这意思吗
      

  3.   

    $v="'b9',NULL,'h,3,he,psaf\'sdfsd,dsf',1,'d-0',1,11,'4d'";
    也一样:<?php
    $v="'b9',NULL,'h,3,he,psaf\'sdfsd,dsf',1,'d-0',1,11,'4d'";
    $arr=eval('return array('.$v.');');
    print_r($arr);
    ?>
    也能正确输出:
    Array
    (
        [0] => b9
        [1] => 
        [2] => h,3,he,psaf'sdfsd,dsf
        [3] => 1
        [4] => d-0
        [5] => 1
        [6] => 11
        [7] => 4d
    )
      

  4.   

    <?php
    //怎么分割:$v="a='b9',b=NULL,c='h,3 = he,p',d=1,e='133.033.133.133',f=1,g=11,h='4d'";的呢?
    $v="a='b9',b=NULL,c='h,3 = he,p',d=1,e='133.033.133.133',f=1,g=11,h='4d'";
    $arr=eval('return array('.str_replace('=','=>',$v).');');
    $arr=str_replace('=>','=',$arr);
    print_r($arr);
    ?>
      

  5.   

    to:yiwusuo() 
    使用eval会把值中的引号替换掉,还有NULL也丢了to:willko(珂)
    如果是下面的就出错了
    $v="'b9',NULL,'1,1,2,2','h,3,he,psaf\'sdfsd,dsf',1,'d-0',1,11,'4d'";
      

  6.   

    还不行就直接字符串处理吧,还方便修改
    $v = "'b9',NULL,'1,1,2,2','h,3,he,psa\'fsdfsd,dsf',1,'d-0',1,11,'4d'";
    $v .= ',';
    $v = str_replace('\\\'',"\\\"",$v);
    $i = 0;
    while($v[$i] || $v[$i] == '0')
    {
    $quoteCount = substr_count($s,'\'');

    if($quoteCount == 1 || $quoteCount == 0)
    {
    $s .= $v[$i];
    }
    if($quoteCount == 2 || $quoteCount == 0 )
    {
    if($v[$i] == ','  ) 
    {
    $s  = rtrim($s,',');
    if(strpos($s,'\"') !== false) $s = str_replace('\"',"\'",$s);
    $str[] = $s;
    unset($s);
    }
    }
    $i++;
    }
    print_r($str);
      

  7.   

    <?php
    $v="'b9',NULL,'1,1,2,2','h,3,he,psaf\'sdfsd,dsf',1,'d-0',1,11,'4d'";
    $pattern = "/,?('.*?(?<![\\\\])')|,?([^,]+),?/";
    $res = array();
    if (preg_match_all($pattern, $v, $match))
    {
    foreach($match[1] as $key=>$val)
    {
    if ($val == '')
    {
    $res[$key] = $match[2][$key];
    }
    else
    $res[$key] = $val;
    }
    }
    echo '<pre>';
    print_r($res);
    ?>
    $v="'b9',NULL,'1,1,2,2','h,3,he,psaf\'sdfsd,dsf',1,'d-0',1,11,'4d'";
    Array
    (
        [0] => 'b9'
        [1] => NULL
        [2] => '1,1,2,2'
        [3] => 'h,3,he,psaf\'sdfsd,dsf'
        [4] => 1
        [5] => 'd-0'
        [6] => 1
        [7] => 11
        [8] => '4d'
    )$v="'b9',NULL,'h,3,he,p',1,'d-0',1,11,'4d'";
    Array
    (
        [0] => 'b9'
        [1] => NULL
        [2] => 'h,3,he,p'
        [3] => 1
        [4] => 'd-0'
        [5] => 1
        [6] => 11
        [7] => '4d'
    )
    $v="'b9',NULL,'h,3,he,psaf\'sdfsd,dsf',1,'d-0',1,11,'4d'";
    Array
    (
        [0] => 'b9'
        [1] => NULL
        [2] => 'h,3,he,psaf\'sdfsd,dsf'
        [3] => 1
        [4] => 'd-0'
        [5] => 1
        [6] => 11
        [7] => '4d'
    )
      

  8.   

    $pattern = "/,?('.*?(?<![\\\\])')|,?([^,]+)/";
      

  9.   

    to:yiwusuo() 
    使用eval会把值中的引号替换掉,还有NULL也丢了
    ------------------------------------------------
    这只是数组正确的输出而已.
    如果你只想要该数组的表达式,$arr=eval('return array('.$v.');');这句已经是默认的
    $arr=Array
    (
        0 => 'b9',
        1 => NULL,
        2 => 'h,3,he,psaf\'sdfsd,dsf',
        3 => 1,
        4 => 'd-0',
        5 => 1,
        6 => 11,
        7 => '4d'
    )
      

  10.   

    <?php
    $v="'b9',NULL,'1,1,2,2','h,3,he,psaf\'sdfsd,dsf',1,'d-0',1,11,'4d'";
    $pattern = "/('.*(?<!\\\)')|\b([^',]+)\b/U";
    if (preg_match_all($pattern, $v, $match))
    {
    echo '<pre>';
    print_r($match[0]);
    }
    ?>