本帖最后由 qepynips 于 2010-03-02 20:08:36 编辑

解决方案 »

  1.   

    如果按你所说的情况用这个 "  作为引号,很难判断正确情况, 就像下面这句话
    dddd " ddd "  ddd"  dddd  "        ddd"  ddd "
    看, 那里是引号内, 那里引号外 ? 人都分辨不出来, 机械就更加不能。 我不清楚你要实际解决的是什么问题,什么情况, 或者你可以换个想法去解决问题,
      

  2.   

    $a =<<<A
    q qq qq "q qq qq" q qq qq " q qq qq "
    A;$reg = '/([^"]+)|(["].+?["])/i';preg_match_all($reg, $a, $matches);$rs = '';foreach ($matches[0] as $m)
    {
        if(preg_match('/["].+?["]/i', $m) != true)
        {
            $rs .= str_replace(' ', '', $m);
        }
        else
        {
            $rs .= $m;
        }
    }echo $rs;
      

  3.   

    以下正则中用到了一个匹配成对引号的小技巧,没想到直接清除引号外的,只能曲线一下了
    $str = <<< STR
    L1: q qq   qq
    L2: "q qq  qq"
    L3: 'q qq  qq'
    L4: "q qq  qq  'q qq  qq'"
    STR;
    $str =str_replace(' ','▓',$str);//先把空格全部用特殊字符保护起来
    $str = preg_replace('/(["\']).*\\1/e',"str_replace('▓',' ','$0');",$str);//把成对的引号的空格还原
    $str = str_replace('▓','',$str);//把原本在引号外的被保护空格干掉
    $str = stripslashes($str);//去掉自动增加的转义符
    echo $str;