1

我有这个 php 代码,我想匹配大括号 {} 中的所有内容

$sentence= "This {is|or|and} a {cat|dog|horse} for a {kid|men|women}";
preg_match("/\{.*?\}/", $sentence, $result);
print_r($result);

但我只得到这个输出:

Array ( [0] => {is|or|and} ) 

但我需要的是这样的结果:

Array ( [0] => is|or|and
[1] => cat|dog|horse
[2] => kid|men|women
 ) 

我应该使用什么正则表达式?

4

5 回答 5

10

改用preg_match_all

preg_match_all("/\{.*?\}/", $sentence, $result);

如果你不想要大括号,你可以做两件事:

捕获大括号内的零件并使用$result[1]HamZa 正确建议的方法将它们取回:

preg_match_all("/\{(.*?)\}/", $sentence, $result);
print_r($result[1]);

或者使用环视(但是它们可能有点难以理解):

preg_match_all("/(?<=\{).*?(?=\})/", $sentence, $result);
print_r($result[0]);

请注意,您也可以使用[^}]*而不是.*?,这通常被认为更安全。

于 2013-08-15T14:42:28.473 回答
3

要获得所有结果,请使用preg_match_all.

提高性能,请使用[^}]*代替.*?.

要摆脱牙套,您可以

  1. 内容分组\{([^}]*)\}并从中获取结果$matches[1]
  2. 使用环视排除大括号,例如(?<=\{)[^}]*(?=\})
  3. 排除第一个大括号\K和第二个大括号,如\{\K[^}]*(?=\})
于 2013-08-15T14:47:23.683 回答
2

您需要使用preg_match_all,是的,但您还需要将您的正则表达式修改为\{(.*?)\}. 请参阅此 Regex101 以获取证明。在你原来的正则表达式中,你没有对结果进行分组,因此也得到了大括号。

于 2013-08-15T14:43:49.323 回答
1

利用preg_match_all

$sentence= "This {is|or|and} a {cat|dog|horse} for a {kid|men|women}";
preg_match_all("/\{[^}]+}/", $sentence, $result);
print_r($result[0]);

会给你

Array
    (
        [0] => {is|or|and}
        [1] => {cat|dog|horse}
        [2] => {kid|men|women}
    )
于 2013-08-15T14:45:39.740 回答
1

更改您的preg_matchtopreg_match_all$resultto$result[1]并稍微修改正则表达式,如下所示:

<?php
$sentence= "This {is|or|and} a {cat|dog|horse} for a {kid|men|women}";
preg_match_all("/\{(.*?)\}/", $sentence, $result);
print_r($result[1]);
?>

输出:

Array
(
    [0] => is|or|and
    [1] => cat|dog|horse
    [2] => kid|men|women
)
于 2013-08-15T14:45:52.533 回答