2010-12-27 8 views
0

文字列を分割しなければならないので、カッコで区切らないようにしたい。 どうすれば実装できますか?Preg_splitをコンマで区切り、カッコを無視するPHP

例:

$string = "string1 (sString1, sString2,(ssString1, ssString2)), string2, string3"; 

result should be: 

array(
    [0] => string1 (sString1, sString2,(ssString1, ssString2)) 
    [1] => string2 
    [2] => string3 
) 
+1

この式は、正規ではないので、これは、正規表現のための仕事ではありません。 [this epic](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)と同じです。 :) – deceze

答えて

6

あなたが正規表現でこれをやろうとしてひどい混乱に取得するつもりです。文字列の文字をループしてこの種のチェックを行うのはとても簡単です。

<?php 

function specialsplit($string) { 
    $level = 0;  // number of nested sets of brackets 
    $ret = array(''); // array to return 
    $cur = 0;   // current index in the array to return, for convenience 

    for ($i = 0; $i < strlen($string); $i++) { 
     switch ($string[$i]) { 
      case '(': 
       $level++; 
       $ret[$cur] .= '('; 
       break; 
      case ')': 
       $level--; 
       $ret[$cur] .= ')'; 
       break; 
      case ',': 
       if ($level == 0) { 
        $cur++; 
        $ret[$cur] = ''; 
        break; 
       } 
       // else fallthrough 
      default: 
       $ret[$cur] .= $string[$i]; 
     } 
    } 

    return $ret; 
} 

var_export(specialsplit("string1 (sString1, sString2,(ssString1, ssString2)), string2, string3")); 

/*array (
    0 => 'string1 (sString1, sString2,(ssString1, ssString2))', 
    1 => ' string2', 
    2 => ' string3', 
)*/ 

分割する1文字以上の文字列がある場合は、この手法ははるかに難しいことに注意してください。

0

私はそれは...あなたのための作品を自分のベストをも試してみました。..

<?php 
$string = "string1 (sString1, sString2,(ssString1, ssString2)), string2, string3"; 
$pattern = '#(?<=\)),#'; 
$out=preg_split($pattern,$string); 
$more=split(",",array_pop($out)); 
$res=array_merge($out,$more); 
echo "<pre>"; 
print_r($res); 

?> 
+0

悪い試しではありませんが、 's1(s2、(s3、s4)、(s5、s6))、s7'のために失敗します。 – codaddict

+0

@codeaddict thatsなぜ私は私のベストを尽くしたと言ったのですか?指向.. – diEcho

関連する問題