2010-12-27 2 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

Это не работа для регулярных выражений, поскольку это выражение не является регулярным. Сравните с [этот эпик] (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', 
)*/ 

Обратите внимание, что этот метод намного труднее сделать, если у вас есть больше, чем строка с одного символа, чтобы разделить на.

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 вот почему я сказал, что я старался изо всех сил .. Мое решение - это только проблема oriented..sorry – diEcho

Смежные вопросы