3

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

first [abc] middle [xyz] last

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

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

现在我想知道获取外部信息的模式。

问候!

4

4 回答 4

6

您可以将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. ?为了避免这种情况,我们通过附加一个to give使其不贪心\[.*?\]。因为我们这里任何东西的定义实际上意味着]我们也可以使用之外的任何东西\[[^]]*?\]

编辑:

如果要提取 内部和外部的单词,[]可以使用:

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

[在 a或 a上拆分字符串]

于 2010-09-15T19:41:16.797 回答
2

正如每个人都说您应该使用 preg_split,但只有一个人回答了满足您需求的表达式,我认为这有点复杂- 不复杂,有点冗长,但他已经更新了他的答案来反驳这一点。

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

/\[.*?\]/

但这只会打印出来

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

你说你想要大括号内外的东西,更新将是:

/[\[.*?\]]/

这给了你:

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

但正如您所看到的,它也捕获了空白,所以让我们更进一步,摆脱那些:

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

这将为您提供所需的结果:

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

我认为这是您正在寻找的表达方式。

这是上述正则表达式的现场演示

于 2010-09-15T20:06:01.123 回答
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

于 2010-09-15T19:40:56.740 回答
2
$inside = '\[.+?\]';
$outside = '[^\[\]]+';
$or = '|';

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

或者不那么冗长

  preg_match_all("~\[.+?\]|[^\[\]]+~", $str, $matches)
于 2010-09-15T19:44:42.300 回答