除了括号中显示的逗号外,如何分割逗号?

时间:2015-02-17 13:20:42

标签: php split

我想像这样分开:

之前:

TEST_A, TEST_B, TEST_C (with A, B, C), TEST_D

后:

TEST_A
TEST_B
TEST_C (with A, B, C)
TEST_D

我该如何拆分?

4 个答案:

答案 0 :(得分:3)

Regex这次不会帮忙,所以你必须遍历这些角色。

事实上,正则表达式不是非常具有上下文感。出于这个原因,you can’t use regular expression to parse HTML。这就是为什么我们最好自己迭代字符串。

function magic_split($str) {
    $sets = array('');  // Sets of strings
    $set_index = 0;     // Remember what index we’re writing to
    $brackets_depth = 0; // Keep track if we’re in brackets (or not)

    // Iterate through entire string
    for($i = 0; $i < strlen($str); $i++) {
        // Skip commas if we’re not in brackets
        if($brackets_depth < 1 && $str[$i] === ',') continue;

        // Add character to current list
        $sets[$set_index] .= $str[$i];

        // Store brackets depth
        if($str[$i] === '(') $brackets_depth++;
        if($str[$i] === ')') $brackets_depth--;

        if(
            $i < strlen($str) - 1 && // Is a next char available?
            $str[$i+1] === ',' &&   // Is it a comma?
            $brackets_depth === 0   // Are we not in brackets?
        ) $sets[++$set_index] = '';  // Add new set
    }

    return $sets;
}

$input = 'TEST_A, TEST_B, TEST_C (with A, B, C), TEST_D';
$split = magic_split($input);

答案 1 :(得分:2)

你想匹配:

  • 一个不包含开括号的单词,也不包含昏迷:[^(,] +
  • 括号内的表达式:\([^(] + \)
    • 或不...并且没有返回匹配,所以它变为:(?:\([^(] + \))?)
  • 昏迷,然后是一些空格:,[\ s] *

PHP代码:

$ar=preg_split("#([^(,]+(?:\([^(]+\))?),[\s]*#", "$input,", -1,
            PREG_SPLIT_DELIM_CAPTURE |PREG_SPLIT_NO_EMPTY)

编辑:如果你没有在括号外面昏迷,它就不起作用。 你需要在上面修改的$ input之后添加一个额外的昏迷。

答案 2 :(得分:1)

此问题的正确解决方案将取决于您的规范用于识别单个元素的确切内容。

如果您希望每个人都以TEST_开头,那么您可以使用正则表达式简单地解决它:

$input = 'TEST_A, TEST_B, TEST_C (with A, B, C), TEST_D';
$matches = preg_split('/,\s*(?=TEST_)/', $input);

var_dump($matches);

输出:

array(4) {
  [0]=>
  string(6) "TEST_A"
  [1]=>
  string(6) "TEST_B"
  [2]=>
  string(21) "TEST_C (with A, B, C)"
  [3]=>
  string(6) "TEST_D"
}

这会在逗号后跟空格上拆分字符串,使用lookahead assertion测试在下一个项目的开头显示TEST_

答案 3 :(得分:0)

您只需要在逗号空间上爆炸而忽略括号内的任何逗号空间。 (*SKIP)(*FAIL)将使用所有括号表达式并将其处置,以使它们不用作分隔符。

代码:(Demo

$text = 'TEST_A, TEST_B, TEST_C (with A, B, C), TEST_D';

var_export(preg_split('~\([^)]*\)(*SKIP)(*FAIL)|, ~', $text));

输出:

array (
  0 => 'TEST_A',
  1 => 'TEST_B',
  2 => 'TEST_C (with A, B, C)',
  3 => 'TEST_D',
)