【问题标题】:Explode a string in php excluding the ', ' within braces分解php中的字符串,不包括大括号内的','
【发布时间】:2016-09-08 02:39:09
【问题描述】:

我有一串这样的-

$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

有什么技巧/想法吗?

【问题讨论】:

  • 您需要使用 preg_split 来测试您的逗号是否在大括号内,如果不是则仅拆分。或者类似preg_match_all('#\(.*?\)|[^,]+#', $str, $matches); var_dump($matches[0]);
  • 你需要正则表达式。
  • 不错的线索,谢谢,我会试一试。 +1
  • @MarkBaker 暂时不行 :(.
  • 使用正则表达式的原则应该仍然适用,只是获得正确的正则表达式是个问题;我会看看我能找到什么

标签: php arrays explode


【解决方案1】:

请试试这个

$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>";

【讨论】:

  • 是的,我不认为正则表达式现在可以做到这一点。虽然它是一个更大的解决方案,但我会接受它。谢谢!
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2015-12-14
    相关资源
    最近更新 更多