求一分割字符的方法

fly3484139 2006-09-18 10:27:01
我要分割这样的字符串:
SiteInfo.TableID,"i.Count DESC,c.ContentEditDate DESC","i.ID,i.SiteID,i.Count,c.Title,c.ContentEditDate","10",SiteInfo.SiteID

需要的效果:
Array
(
[0] => SiteInfo.TableID
[1] => "i.Count DESC,c.ContentEditDate DESC"
[2] => "i.ID,i.SiteID,i.Count,c.Title,c.ContentEditDate"
[3] => "10"
[4] => SiteInfo.SiteID
)
正则应该可以实现吧,就是不知道怎么写,请教高手了!
...全文
249 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly3484139 2006-09-18
  • 打赏
  • 举报
回复
晕,格式这样了,重发

function split_tag($tag_msg='')
{
$t = 0;
$tt = 0;
$return_tag = null;
$return_tag_msg = "";
if($tag_msg == '')
{
return $return_tag_msg;
}else{
$tag_array = explode(",", $tag_msg);
foreach ($tag_array as $tkey => $tvar)
{
if (substr($tvar, 0, 1) == '"' && substr($tvar, -1) != '"')
{
$return_tag[$t] = $tvar;
$tt=1;
continue;
}
if (substr($tvar, -1) == '"' && substr($tvar, 0, 1) != '"' )
{
$return_tag[$t] .= ",".$tvar;
$t++;
$tt=0;
continue;
}

if (substr($tvar, 0, 1) == '"' && substr($tvar, -1) == '"')
{
$return_tag[$t] = $tvar;
$t++;
continue;
}

if (substr($tvar, 0, 1) != '"' && substr($tvar, -1) != '"')
{
if($tt == 1)
{
$return_tag[$t] .= ",".$tvar;
continue;
}else{
list($block1, $skalar1) = $this->var_name($tvar); 此处为另外的转换函数,变量才转换(引号括起来的视为字符串)
$return_tag[$t] = "\$$block1"."['$skalar1']";
$t++;
continue;
}
}
}
$return_tag_msg = implode(",", $return_tag);
return $return_tag_msg;
}
}
fly3484139 2006-09-18
  • 打赏
  • 举报
回复
我在改写模板系统里面的一个函数调用的问题。
要达到的效果是,字符串和变量分割开来,变量需再次替换。
TO:iasky(C#_ASP_PHP) 你的方法基本是可以达到,只少了原来的“"”号。

我自已写了个方法可以,感觉笨了点。
function split_tag($tag_msg='')
{
$t = 0;
$tt = 0;
$return_tag = null;
$return_tag_msg = "";
if($tag_msg == '')
{
return $return_tag_msg;
}else{
$tag_array = explode(",", $tag_msg);
foreach ($tag_array as $tkey => $tvar)
{
if (substr($tvar, 0, 1) == '"' && substr($tvar, -1) != '"')
{
$return_tag[$t] = $tvar;
$tt=1;
continue;
}
if (substr($tvar, -1) == '"' && substr($tvar, 0, 1) != '"' )
{
$return_tag[$t] .= ",".$tvar;
$t++;
$tt=0;
continue;
}

if (substr($tvar, 0, 1) == '"' && substr($tvar, -1) == '"')
{
$return_tag[$t] = $tvar;
$t++;
continue;
}

if (substr($tvar, 0, 1) != '"' && substr($tvar, -1) != '"')
{
if($tt == 1)
{
$return_tag[$t] .= ",".$tvar;
continue;
}else{
$return_tag[$t] = $tvar;
$t++;
continue;
}
}
}
$return_tag_msg = implode(",", $return_tag);
return $return_tag_msg;
}
}
aruhan 2006-09-18
  • 打赏
  • 举报
回复
<?
$str = 'SiteInfo.TableID,"i.Count DESC,c.ContentEditDate DESC","i.ID,i.SiteID,i.Count,c.Title,c.ContentEditDate","10",SiteInfo.SiteID';
$re = preg_split("/,\"|\",/",$str);
print_r ($re);
?>
ClintNorthwood 2006-09-18
  • 打赏
  • 举报
回复
$b =preg_split("/,\"|\",/",$a);
$b[1]="\"".$b[1]."\"";
$b[2].="\"";
$b[3].="\"";
print_r ($b);
iasky 2006-09-18
  • 打赏
  • 举报
回复
<?php
$s = "SiteInfo.TableID,\"i.Count DESC,c.ContentEditDate DESC\",\"i.ID,i.SiteID,i.Count,c.Title,c.ContentEditDate\",\"10\",SiteInfo.SiteID";
$p = '/[,"]?([^"]+)[,"]?/i';
preg_match_all($p,$s,$a);
echo "<pre>";
print_r(array_filter($a[1],create_function('$a', 'if ($a != ",") return $a;')));
echo "</pre>";
?>
Array
(
[0] => SiteInfo.TableID,
[1] => i.Count DESC,c.ContentEditDate DESC
[3] => i.ID,i.SiteID,i.Count,c.Title,c.ContentEditDate
[5] => 10
[6] => SiteInfo.SiteID
)

还没有想到好的方法……
lzkd 2006-09-18
  • 打赏
  • 举报
回复
楼主,你分割的标准是什么?看了一下,没能总结出规律来
zeroleonhart 2006-09-18
  • 打赏
  • 举报
回复
explode(",",$str);
gun_hzic 2006-09-18
  • 打赏
  • 举报
回复
最笨的办法,请大家指教.
$a = explode(",\"", $str);
$a[1] ="\"".$a[1];
$a[2] ="\"".$a[2];
$b = explode("\",", $a[3]);
unset($a[3]);
$b[0] = "\"".$b[0]."\"";
$c=array_merge($a,$b);
print_r($c);
fly3484139 2006-09-18
  • 打赏
  • 举报
回复
学习的路还很长
fly3484139 2006-09-18
  • 打赏
  • 举报
回复
高手!TO:Meteorlet(www.dictworld.com)
三行代码就搞定。非常感谢!

结贴了!
iasky 2006-09-18
  • 打赏
  • 举报
回复
学习楼上的了,原来是csv格式
Meteorlet 2006-09-18
  • 打赏
  • 举报
回复
这就是CSV格式的字符串,都没有人往这方面想的,PHP.net提供很多解决方案:
http://us3.php.net/manual/en/function.fgetcsv.php
个人比较好的:用正则表达式
<?

function csv_string_to_array($str){
$expr="/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/";
$results=preg_split($expr,trim($str));
return preg_replace("/^\"(.*)\"$/","$1",$results);
}
$str=<<<EOF
"testing, stuff, here","is testing ok",200,456
EOF;
print_r(csv_string_to_array($str));
?>
fly3484139 2006-09-18
  • 打赏
  • 举报
回复
一楼的不可以,参数又不是一固定的。难点在于,字符串中有“,”号,跟分割符相同。但字符串是引号括起来的。
邦迪代驾 2006-09-18
  • 打赏
  • 举报
回复
还不如直接写呢
lantersen 2006-09-18
  • 打赏
  • 举报
回复
如果数据基本上如你上述,还是用一楼的吧,经济实惠。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧