如何从多个数组中仅获取最后一个括号?的PHP

时间:2019-03-29 19:55:05

标签: php arrays

我有几个数组,我只需要选择最后一个括号中的内容。怎么做?

例如,我的某些数组总是相似,但有所不同:

Array
(
    [0] => 3 BUILTIN\Users:(OI)(CI)(F)
)
Array
(
    [0] => BUILTIN\Users:(OI)(CI)(R)
)
Array
(
    [0] => 22 BUILTIN\Users:(OI)(CI)(R,W)
)

我想从中得到结果:

(F)
(R)
(R,W)

我必须使用substr还是什么? 问候

2 个答案:

答案 0 :(得分:1)

您可以使用preg_filter

$arr = array(
    '3 BUILTIN\Users:(OI)(CI)(F)',
    'BUILTIN\Users:(OI)(CI)(R)',
    '22 BUILTIN\Users:(OI)(CI)(R,W)'
);

print_r(preg_filter('/^.+(\([^)]+\))$/', '\1', $arr));

输出

Array
(
    [0] => (F)
    [1] => (R)
    [2] => (R,W)
)

Sandbox

正则表达式

  • ^-匹配字符串的开头
  • .+-匹配任何一个或多个“贪婪”
  • (...)-第一个捕获组
    • \(从字面上(
    • [^)]+匹配任何“不” )
    • \)从字面上)
  • $-匹配字符串的结尾。

所以这是用第一个捕获组\1替换捕获组中不在数组中的每个数组项中的所有内容。从最后一个(的开头到该“集合” )的结尾,所有内容都应匹配。基本上,我们想要的只是“填充”最后一个括号,这很好,因为上面的代码就是这样做的(奇怪的是,就像有人按照我们需要的方式来设置它……大声笑)。

这还应该从数组中删除与该模式不匹配的所有内容。例如:

$arr = array(
    '3 BUILTIN\Users:(OI)(CI)(F)',
    'BUILTIN\Users:(OI)(CI)(R)',
    '22 BUILTIN\Users:(OI)(CI)(R,W)',
    'foo' //--- foo will not appear in the results, because it does not end with (...)
);

希望有帮助!

  

preg_filter() preg_replace()相同,只是它只返回存在匹配项的(可能是经过转换的)主题。有关此功能如何工作的详细信息,请阅读 preg_replace()文档。   https://www.php.net/manual/en/function.preg-filter.php

* PS 我给出了上面的示例,因为它着重说明了preg_replace()preg_filter()之间的区别(如上所述)。如果您确定每个项目中始终都有匹配项,则可以只用preg_replace()进行相同操作。

答案 1 :(得分:0)

您可以在这里

$arr = array(
        '3 BUILTIN\Users:(OI)(CI)(F)',
        'BUILTIN\Users:(OI)(CI)(R)',
        '22 BUILTIN\Users:(OI)(CI)(R,W)'
    );
$newArr = array();
foreach($arr as $k => $v){
    $lastElement = array_filter(explode('(',explode(':',$v)[1]));
    $newArr[] = '('.$lastElement[count($lastElement)];
}
print_r($newArr);

结果:-

Array
(
 [0] => (F)
 [1] => (R)
 [2] => (R,W)
)