前段时间问了一个问题见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'
)
<?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'
)
$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);
?>
$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
)
是这意思吗
也一样:<?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
)
//怎么分割:$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);
?>
使用eval会把值中的引号替换掉,还有NULL也丢了to:willko(珂)
如果是下面的就出错了
$v="'b9',NULL,'1,1,2,2','h,3,he,psaf\'sdfsd,dsf',1,'d-0',1,11,'4d'";
$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);
$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'
)
使用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'
)
了
$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]);
}
?>