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
)

person PPPHP    schedule 27.12.2010    source источник
comment
Это не работа для регулярного выражения, так как это выражение не является регулярным. Сравните с этой эпопеей, то же самое вещь. :)   -  person deceze♦    schedule 27.12.2010


Ответы (2)


Вы попадете в ужасный беспорядок, пытаясь сделать это с помощью регулярных выражений. Очень просто перебрать символы строки и выполнить такую ​​проверку. Что-то вроде следующего должно работать:

<?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',
)*/

Обратите внимание, что эту технику намного сложнее использовать, если у вас есть более чем односимвольная строка для разделения.

person lonesomeday    schedule 27.12.2010
comment
я пытаюсь сделать это с помощью preg_split и потратил более 2 часов, но это не работает .... Большое спасибо за этот код :) - person Ahmed Al Bermawy; 06.04.2018

Я старался изо всех сил ... это может сработать для вас ..

<?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);

?>
person diEcho    schedule 27.12.2010
comment
Неплохая попытка.. но не s1(s2,(s3,s4),(s5,s6)),s7 - person codaddict; 27.12.2010
comment
@codeaddict вот почему я сказал, что старался изо всех сил .. мое решение ориентировано только на проблемы .. извините - person diEcho; 27.12.2010