如何在PHP中获取括号内的所有内容?

4
Array(
[1] => put returns (between) paragraphs
[2] => (for) linebreak (add) 2 spaces at end
[3] => indent code by 4 (spaces!)
[4] => to make links
)

想要获取括号内的文本(对于每个值):

  1. 仅取第一个匹配项
  2. 从值中删除此匹配项
  3. 将所有匹配项写入新数组

函数执行后,数组应如下所示:

Array(
[1] => put returns paragraphs
[2] => linebreak (add) 2 spaces at end
[3] => indent code by 4
[4] => to make links
)
Array(
[1] => between
[2] => for
[3] => spaces!
[4] => 
)

什么是解决方案?
2个回答

2
假设您的意思是使用(between)而不是((between))
$arr = array(
                0 => 'put returns (between) paragraphs',
                1 => '(for) linebreak (add) 2 spaces at end',
                2 => 'indent code by 4 (spaces!)',
                3 => 'to make links');
var_dump($arr);

$new_arr = array();
foreach($arr as $key => &$str) {
        if(preg_match('/(\(.*?\))/',$str,$m)) {
                $new_arr[] = $m[1]; 
                $str = preg_replace('/\(.*?\)/','',$str,1);
        }   
        else {
                $new_arr[] = ''; 
        }   
}
var_dump($arr);
var_dump($new_arr);

Working link


2

我会使用正则表达式 /\((\([^()]*\)|[^()]*)\)/(这将匹配一个或两个括号对),再结合preg_split函数:

$matches = array();
foreach ($arr as &$value) {
    $parts = preg_split('/\((\([^()]*\)|[^()]*)\)/', $value, 2, PREG_SPLIT_DELIM_CAPTURE);
    if (count($parts) > 1) {
        $matches[] = current(array_splice($parts, 1, 1));
        $value = implode('', $parts);
    }
}

使用设置了PREG_SPLIT_DELIM_CAPTURE标志的preg_split将匹配的分隔符包含在结果数组中。因此,如果找到了匹配项,则至少有三个部分。在这种情况下,第二个成员就是我们要查找的成员。使用array_splice删除该成员,并返回删除成员的数组。要获取已删除的成员,需要在array_splice的返回值上使用current。然后将其余成员重新组合在一起。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接