正则表达式:获取括号外的内容

时间:2010-09-15 19:38:09

标签: php regex preg-match-all

我正在使用PHP,我的文字如下:

first [abc] middle [xyz] last

我需要得到括号内外的内容。在StackOverflow中搜索我找到了一个模式来获取内部的内容:

preg_match_all('/\[.*?\]/', $m, $s)

现在我想知道获得外面的模式。

问候!

4 个答案:

答案 0 :(得分:4)

您可以将preg_split用作:

$input ='first [abc] middle [xyz] last';
$arr = preg_split('/\[.*?\]/',$input);
print_r($arr);

输出:

Array
(
    [0] => first 
    [1] =>  middle 
    [2] =>  last
)

这允许输出中的一些周围空格。如果您不想要它们,可以使用:

$arr = preg_split('/\s*\[.*?\]\s*/',$input);

preg_split根据模式拆分字符串。此处的模式为[,后跟]后跟的任何内容。匹配任何内容的正则表达式是.*。此外,[]是用于char类的正则表达式字符。由于我们希望从字面上匹配它们,我们需要将它们转义为\[.*\]。默认情况下,.*是贪婪的,并会尝试尽可能匹配。在这种情况下,它将匹配abc] middle [xyz。为了避免这种情况,我们将其?附加到\[.*?\],使其变得非贪婪。由于我们对此处的任何内容的def实际上意味着]以外的任何内容,我们也可以使用\[[^]]*?\]

修改

如果您要提取[]内外的字词,可以使用:

$arr = preg_split('/\[|\]/',$input);

将字符串拆分为[]

答案 1 :(得分:2)

使用preg_split而不是preg_match。

preg_split('/\[.*?\]/', 'first [abc] middle [xyz] last');

结果:

array(3) {
  [0]=>
  string(6) "first "
  [1]=>
  string(8) " middle "
  [2]=>
  string(5) " last"
}

ideone

答案 2 :(得分:1)

$inside = '\[.+?\]';
$outside = '[^\[\]]+';
$or = '|';

preg_match_all(
    "~ $inside $or $outside~x", 
    "first [abc] middle [xyz] last", 
    $m);
print_r($m);

或更简洁

  preg_match_all("~\[.+?\]|[^\[\]]+~", $str, $matches)

答案 3 :(得分:1)

正如每个人都说你应该使用preg_split,但只有一个人用满足你需要的表达式回复,我觉得这有点复杂 - 不复杂,有点啰嗦但是他更新了他的答案以反驳这一点。

这个表达是大多数回复所说的。

/\[.*?\]/

但那只打印出来

Array
(
    [0] => first 
    [1] =>  middle 
    [2] =>  last
)

并且你说你想要在大括号内外都有什么,sio更新将是:

/[\[.*?\]]/

这会给你:

Array
(
    [0] => first 
    [1] => abc
    [2] =>  middle 
    [3] => xyz
    [4] =>  last
)

但是正如你可以看到它也捕获了白色空间,所以让我们更进一步去除那些:

/[\s]*[\[.*?\]][\s]*/

这会给你一个理想的结果:

Array
(
    [0] => first
    [1] => abc
    [2] => middle
    [3] => xyz
    [4] => last
)

我认为这是你要找的表达方式。

Here is a LIVE Demonstration of the above Regex