Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取方括号的内容,避免嵌套括号_Php_Regex_Recursion_Preg Match_Parentheses - Fatal编程技术网

Php 获取方括号的内容,避免嵌套括号

Php 获取方括号的内容,避免嵌套括号,php,regex,recursion,preg-match,parentheses,Php,Regex,Recursion,Preg Match,Parentheses,(首次发布海报,通过谷歌长期访问) 我试图提取一些方括号中的内容,但是有点麻烦。我已经让它适用于圆括号,如下所示,但我看不出应该如何修改它以适用于方括号。在本例中,我本以为用圆代替方,反之亦然,但显然不行 它需要忽略括号中的括号。所以它不会返回(11),但会返回(10(11)12) 试试这个: 这似乎也不起作用,除非我的测试代码在某个地方出错。下面是代码和响应:$preg='/[(?:[^[]]+(?R))*]/'$str='123[456][789][10[11]12];如果($count=p

(首次发布海报,通过谷歌长期访问)

我试图提取一些方括号中的内容,但是有点麻烦。我已经让它适用于圆括号,如下所示,但我看不出应该如何修改它以适用于方括号。在本例中,我本以为用圆代替方,反之亦然,但显然不行

它需要忽略括号中的括号。所以它不会返回(11),但会返回(10(11)12)

试试这个:


这似乎也不起作用,除非我的测试代码在某个地方出错。下面是代码和响应:$preg='/[(?:[^[]]+(?R))*]/'$str='123[456][789][10[11]12];如果($count=preg_match_all($preg,$str,$matches)){$matches=$matches[0];}否则{$matches=array();}echo$count.'''.print_r($matches,true)。'';返回:0 Array()@Alix Axel:它由
(?R)
组成,末尾的
)*
是较大表达式的一部分。我复制粘贴了您的示例并修改了处理其他大括号所需的部分。但是,正如您在此期间看到的(您已经修复了它),您的代码示例具有错误的管道字符。以我期望的结果进行测试。谢谢,现在已经很完美了。很抱歉回复晚了。在这里结束一天。对于将来发现这个的人,我不知道是否可以通过确保它只返回一个数组而不是第二个数组来提高性能。但除了那个完美的答案,答案被接受了。当我在我的机器上运行这个例子时,我实际上没有得到任何匹配。PHP 5.2.6您的圆括号示例对我不起作用。嗯,您是对的,我显然在测试中弄坏了一些东西,我将重新检查花括号方法,也许这就是为什么我不能让它对方括号起作用。花括号的工作正则表达式是“#”((((?>[^()])+)|(?)*)#x”。发布的是我在谷歌搜索中发现的一个问题,这是我在问题中发布的错误。您是否需要处理多个嵌套括号的情况,例如“[12[34[56]78]90]”?谢谢您,但第一个括号似乎仅限于某个深度。例如,试试这个:[123][456][789][10[11]12][141516][somethingelse]。第二种方法将嵌套的括号分开。所以在这方面根本不起作用。
$preg = '#\(((?>[^()]+)|(?R))*\)#x';
$str = '123(456)(789)(10(11)12)';

if(preg_match_all($preg, $str, $matches)) {
    $matches = $matches[0];
} else {
    $matches = array();
}

echo '<pre>'.print_r($matches,true).'</pre>';

This returns:

Array (
    [0] => (456)
    [1] => (789)
    [2] => (10(11)12)
)
$str = '123[456][789][10[11]12]'; 
$preg = '#\[((?>[^\[\]]+)|(?R))*\]#x';
$str = '123[456][789][10[11]12]';
$pattern = '/(([\d]+)|(\[[\d]+\])|\[[\d\[\]]+\])/';
preg_match_all($pattern,$str,$matches);
print_r($matches[0]);
//or
$str = '123[456][789][10[11]12]';
$pattern = '/(([\d]+)|(\[[\d]+\]))/';
preg_match_all($pattern,$str,$matches);
print_r($matches[0]);