我有几个数组,我只需要选择最后一个括号中的内容。怎么做?
例如,我的某些数组总是相似,但有所不同:
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还是什么? 问候
答案 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)
)
正则表达式
^
-匹配字符串的开头.+
-匹配任何一个或多个“贪婪” (...)
-第一个捕获组
\(
从字面上(
[^)]+
匹配任何“不” )
\)
从字面上)
$
-匹配字符串的结尾。所以这是用第一个捕获组\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)
)