如何从字符串中捕获数组格式的子字符串

时间:2016-02-13 11:53:05

标签: php regex substring preg-match square-bracket

我想得到一个数组格式的子字符串,它位于input()内。我使用preg_match但无法获得整个表达式。它停在第一个)。我如何匹配整个子字符串?谢谢。

$input="input([[1,2,nc(2)],[1,2,nc(1)]])";
preg_match('@^([^[]+)?([^)]+)@i',$input, $output); 

期望是:

'[[1,2,nc(2)],[1,2,nc(1)]]'

4 个答案:

答案 0 :(得分:1)

试试这个:

    $input="input([[1,2,nc(2)],[1,2,nc(1)]])";
    preg_match('/input\((.*?\]\])\)/',$input,$matches);
    print_r($matches);

$ matches [1] 将包含您需要的整个结果。希望这有效。

答案 1 :(得分:1)

你想要它纯粹作为一个字符串?使用这个简单的正则表达式:

preg_match('/\((.*)\)$/',$input,$matches);

答案 2 :(得分:1)

此模式匹配您想要的字符串(也包括起始字≠'input':

@^(.+?)\((.+?)\)$@i

eval.in demo

^(.+?)   => find any char at start (ungreedy option)
\)       => find one parenthesis 
(.+?)    => find any char (ungreedy option) => your desired match
\)       => find last parenthesis

答案 3 :(得分:1)

其他答案都没有有效/准确地回答您的问题:

要获得最快的准确模式,请使用:

$input="input([[1,2,nc(2)],[1,2,nc(1)]])";
echo preg_match('/input\((.*)\)/i',$input,$output)?$output[1]:'';
//                                            notice index ^

或者通过避开捕获组使用减少50%内存的稍微慢一点的模式,使用:

$input="input([[1,2,nc(2)],[1,2,nc(1)]])";
echo preg_match('/input\(\K(.*)(?=\))/i',$input,$output)?$output[0]:'';
//                                                  notice index ^

两种方法都会提供相同的输出:[[1,2,nc(2)],[1,2,nc(1)]]

使用贪婪的*量词允许模式移动通过嵌套括号并匹配整个预期的子字符串。

在第二种模式中,\K重置匹配的起始点,(?=\))是一个正向前瞻,确保匹配整个子字符串而不包括尾部右括号。

编辑:所有正则表达式卷积除外,因为你知道你想要的子字符串包含在input()中,最好的,最简单的方法是非正则表达式...

$input="input([[1,2,nc(2)],[1,2,nc(1)]])";
echo substr($input,6,-1);
// output: [[1,2,nc(2)],[1,2,nc(1)]]

完成。