Regex -在PHP中将表达式分解成位


Regex - disect a expression into bits in PHP

我正在尝试解析某个表达式:

column_count:[dropdown]:[2:3:4:6]:[3]

有4个部分我需要读出来:

1. column_count -> no brackets (using preg_split?)
2. [dropdown]:[2:3:4:6]:[3] -> into 3 parts of "brackets insides"
3. [2:3:4:6] -> this third part needs further disection into 4 different values
所以我的输出是:
1. string: column_count
2. array([dropdown], [2:3:4:6], [3])
3. array(2, 3, 4, 6)

我想我需要3个不同的正则表达式,但我仍然是新的与他们,我不知道如何接近这些步骤。

欢迎任何解释或提示,我想学习它

对我来说更容易的是用更多或更少的细节(取决于可能的格式)来描述完整的字符串,并使用捕获组来隔离用分号分隔的主要部分。这样做之后,您只需要使用基本操作来获取所需的项:

$str = 'column_count:[dropdown]:[2:3:4:6]:[3]';
$pattern = '~^([^:]+):('[[^]]*]):('[[^]]*]):(.*)$~'; 
if (preg_match($pattern, $str, $m))
    $result = [
        $m[1],
        [ $m[2], $m[3], $m[4] ],
        explode(':', trim($m[3], '[]'))
    ];
var_dump($result);

请注意,该模式主要使用否定字符类[^...]来阻止贪婪量词。

不使用regex的另一种方式:

思路是将字符串转换为csv行。为此,将所有[]strtr一起转换为"[]",并将双引号定义为str_getcsv的外壳参数。通过这种方式,解析器会忽略方括号之间的冒号(因为它们现在位于双引号之间)。

$p = str_getcsv(strtr($str, ['['=>'"[', ']'=>']"']), ':', '"');
$result2 = [
    $p[0],
    [ $p[1], $p[2], $p[3] ],
    explode(':', trim($p[2], '[]'))
];
var_dump($result2);

尝试preg_split和regex "/:(?='[)/",它应该给你一个像array( 'column_count1', '[dropdown]', '[2:3:4:6]', '[3]' )的数组。对于最后一部分,您可以使用preg_match_all和正则表达式'd(或'd+)。

regex中的(?='[)部分为正向断言提前查找