2016-05-12 4 views
3

у меня есть строка this-Explode строки в PHP исключая «» в фигурных скобках

$str = "field1.id as field1, 
     DATE_SUB(field2, INTERVAL (DAYOFMONTH(field2)-1) DAY) as field2, 
     field3.name as field3"; 

Нужно explode этого в массив с , как это:

$requiredArray = array(
    0 => field1.id as field1, 
    1 => DATE_SUB(field2, INTERVAL (DAYOFMONTH(field2)-1) DAY) as field2 
    2 => field3.name as field3 
); 

Я попытался с взрывом, но он не работает:

$requiredArray = explode(', ', $str); 
// doesn't work as "DATE_SUB(field2, INTERVAL ..." also gets exploded 

Любой трюк/идеи?

+4

Вы должны будете использовать preg_split, который может проверить, если ваша запятая внутри скобок и только разделить, если это не так. Или возможно что-то вроде 'preg_match_all ('# \ (. *? \) | [^,] + #', $ Str, $ matches); var_dump ($ matches [0]); ' –

+0

вам нужно регулярное выражение. –

+0

Приятная подсказка, спасибо, я попробую. +1 – jitendrapurohit

ответ

4

Пожалуйста, попробуйте это

$str = "field1.id as field1, 
     DATE_SUB(field2, INTERVAL (DAYOFMONTH(field2)-1) DAY) as field2, 
     field3.name as field3"; 

$buffer = ''; 
$stack = array(); 
$depth = 0; 
$len = strlen($str); 
for ($i=0; $i<$len; $i++) { 
    $char = $str[$i]; 
    switch ($char) { 
    case '(': 
     $depth++; 
     break; 
    case ',': 
     if (!$depth) { 
      if ($buffer !== '') { 
       $stack[] = $buffer; 
       $buffer = ''; 
      } 
      continue 2; 
     } 
     break; 
    case ' ': 
     if (!$depth) { 
      $buffer .= ' '; 
      continue 2; 
     } 
     break; 
    case ')': 
     if ($depth) { 
      $depth--; 
     } else { 
      $stack[] = $buffer.$char; 
      $buffer = ''; 
      continue 2; 
     } 
     break; 
    } 
    $buffer .= $char; 
} 
if ($buffer !== '') { 
    $stack[] = $buffer; 
} 
echo "<pre>"; 
print_r($stack); 
echo "</pre>"; 
+0

замечательное решение .... –

+0

Да, я не думаю, что regex может сделать это сейчас. Хотя его больше, я пойду с ним. Благодаря! – jitendrapurohit

+0

http://stackoverflow.com/questions/4538086/preg-split-by-comma-ignore-parentheses-php/4538153#4538153 тоже хорошо работает :) – jitendrapurohit

-1

Попробуйте это:

preg_match_all('~(.*)[^(],?~', $str, $matches); 
+0

nope, проверьте его вне.. . [Ответ] (https://3v4l.org/EeQog) –

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

  • Нет связанных вопросов^_^