eval下直接可以执行。。
如果是JS的话。。不过相信PHP也可以的。。毕竟语法类似嘛。。
<script type="text/javascript">
alert(eval('([q1,[q2,q3,q4],p,{o,{d}},m,n])'));
</script>

解决方案 »

  1.   

    简单测试了一下
    $s = "q1,[q2,q3,q4],p,{o,{d}},m,n";
    echo preg_replace("/(,\s*\[|\]\s*)/mi","◇",$s);
    []部分可以完全替换,然后用explode可以分开一部分了。但是{}的判断,不太成功,呵呵。
      

  2.   

    C#的测试例子
    string str = "'[q1,[q2,q3,q4],p,{o,{d}},m,n]'";
    string pattern = @"(?<='[\{\[]|,)(\{.*?\}|\[.*?\]|.*?)(?=[\},\]]'|,)";
    MatchCollection mc = Regex.Matches(str, pattern);
    foreach (Match m in mc)
    {
    Console.WriteLine(m.Value);
    }-------
    输出:
    q1
    [q2,q3,q4]
    p
    {o,{d}}
    m
    n我不懂PHP,不知道PHP是否支持反向正声明
      

  3.   

    <?php
        $m = array();
        $str = '[q1,[q2,q3,q4],p,{o,{d}},m,n]';//字符串
        preg_match('/(?!=[\{\[]|,)(\{.*\}|\[.*\]|.*)(?=[\},\]]|,)/s', $str, $m);
        foreach($m as $out) {
           echo $out.'<br/>';
        }
    ?>
      
    照0009(夏天以南) 的正则改了下,
    输出的是
    [q1,[q2,q3,q4]
    [q1,[q2,q3,q4]当然 js 是可以直接eval的说,但是要的是php的。小弟愚笨,没有好好学过php,    
    foreach($m[2] as $out) {
           echo $out.'<br/>';
        }
    改成这样就出错
      

  4.   

    <?php
        $str = '[q1,[q2,q3,q4],p,{o,{d}},m,n}]';//字符串
        preg_match_all('/(?<=[\{\[]|,)(\{.*?\}|\[.*?\]|.*?)(?=[\}\]]|,)/', $str, $matches);
    for ($i=0; $i< count($matches[0]); $i++) {
        echo "matched: ".$matches[0][$i]."<br/>";
    }
    ?>
    又改了,
    结果如下
    matched: q1
    matched: [q2,q3,q4]
    matched: p
    matched: {o,{d}
    matched: m
    matched: n少了一个大括号。还有,可以解释一下,写的正则的意思吗?
      

  5.   

    如果用正则的话。很麻烦。。如果你那个若干层欠套的话。。并且还有转义啊。引号啊。什么什么的东西。。
    php里不是支持json么?
    用解json的方法解下不就行了么?
      

  6.   

    $str = '[q1,[q2,q3,q4],p,{o,{d}},m,n}]';//字符串
    preg_match_all('/(?<=[\{\[]|,)(\{.*?\}|\[.*?\]|.*?)(?=[\}\]]{2}|,)/', $str, $matches);
    for ($i=0; $i< count($matches[0]); $i++)
    echo "matched: ".$matches[0][$i]."<br/>";修改了一下,可以了
      

  7.   

    这个正则有些牵强说
    如果我把字符串改成$str = '[q1,[q2,q3,q4],p,{o,{d},j},m,n}]';//字符串
    则输出的结果为matched: q1
    matched: [q2,q3,q4]
    matched: p
    matched: {o,{d}
    matched: j}
    matched: m
    matched: n
    另外,小弟搞这个就是当json用
    php要5.20以上才支持。另外用一个网上的竟然出来的乱码,索性自己简单的写个用用。
    不想遇到如此问题,
      

  8.   

    (?<=^[\{\[]|,)(\{.*?\}|\[.*?\]|.*?)(?=[\}\]]$|,)
    这个正则分为三个部分一 (?<=^[\{\[]|,)
    这是一个反向正声明,只做声明不做匹配.(正因为使用了反向正声明和正声明,才能够得到多个匹配结果),这个声明是指在匹配内容的前面必须是以{或[符号开头(匹配第一个元素),或者是逗号(匹配中间的元素).二 (\{.*?\}|\[.*?\]|.*?) 实际上只要写成 (\{.*\}|\[.*\]|.*?) 就行
    这是匹配主体,规定了匹配三种模式.{.*}或者[.*]或者.*?三 (?=[\}\]]$|,)
    这是一个正声明,指明了匹配内容的后面必须是]或者}结尾(匹配最后一个元素),或者是一个逗号(匹配中间元素)
      

  9.   

    hejunbin(何俊斌) ( ) 信誉:100    Blog
    这个正则有些牵强说
    如果我把字符串改成$str = '[q1,[q2,q3,q4],p,{o,{d},j},m,n}]';//字符串
    则输出的结果为
    ----------------汗...我不知道你给的这个字符串是做什么用的,所以没考虑到这样的情况,对这个例子用那个修改过的正则也是不行,我再看看
      

  10.   

    不对吧
    你给的这个
    [q1,[q2,q3,q4],p,{o,{d},j},m,n}]
    本身就是不配对的
    少了一个{
      

  11.   

    [q1,[q2,q3,q4],p,{o,{d},j},m,n]这样的结果如下:
    matched: q1
    matched: [q2,q3,q4]
    matched: p
    matched: {o,{d}
    matched: j}
    matched: m
    matched: n
      

  12.   

    hejunbin(何俊斌) ( ) 信誉:100    Blog 
    不好意思,测试的时候多加了一个},
    呵呵,
    正则倒是看懂了些,
    另外这个好像有嵌套的问题,
    我网上找找资料
    --------------------什么嵌套问题?
    用正则
    (?<=^[\{\[]|,)(\{.*\}|\[.*\]|.*?)(?=[\}\]]$|,)
    匹配
    [q1,[q2,q3,q4],p,{o,{d},j},m,n]
    得到结果为
    q1
    [q2,q3,q4]
    p
    {o,{d},j}
    m
    n是不是你想要的?
      

  13.   

    <?php
        //echo substr('TechOnTheNet', 1, -1);
        //var $p =  'hejunbin';
        //echo $p{1};
    $str = '[q1,[q2,q3,q4],p,{o,{d},j},m,n]';//字符串
    preg_match_all('/(?<=^[\{\[]|,)((\{([^\{\}]|(?R))*\})|(\[([^\[\]]|(?R))*\])|.*?)(?=[\}\]]|,)/', $str, $matches);
    for ($i=0; $i< count($matches[0]); $i++)
    echo "matched: ".$matches[0][$i]."<br/>";
    ?>
    输出如下:matched: q1
    matched: [q2,q3,q4]
    matched: p
    matched: {o,{d},j}
    matched: m
    matched: n哈哈,这回问题解决了,
    参考如下有的正则表达式引擎,专门针对这种嵌套提供了支持。并且在栈空间允许的情况下,能够支持任意未知层次的嵌套:比如 Perl,PHP,GRETA 等。在 PHP 和 GRETA 中,表达式中使用 "(?R)" 来表示嵌套部分。匹配嵌套了未知层次的 "小括号对" 的表达式写法如下:"\(  ([^()]  |  (?R))*  \)"。
      

  14.   

    (?R)的用法我是第一次看到呵呵,因为只是少数的语言支持
    不过用(?<=^[\{\[]|,)(\{.*\}|\[.*\]|.*?)(?=[\}\]]$|,)
    也能够达到你所需的结果
      

  15.   

    0009(夏天以南) (?<=^[\{\[]|,)(\{.*\}|\[.*\]|.*?)(?=[\}\]]$|,)哈哈,果然也是可以的,比我改的正则要好许多。谢谢,结帖。
    O.o
      

  16.   

    hejunbin(何俊斌) ( ) 信誉:100    Blog 哈哈,果然也是可以的,比我改的正则要好许多。谢谢,结帖。
    O.o
    ---------------------
    实际上这个正则也是不通用的 -_-比如[q1,[q2,q3,q4],p,{o,{d},j},m,{x,y},n]
    还是用你那个?R吧...