获取大括号之间出现的所有单词

时间:2011-11-09 14:41:19

标签: php regex

我的文字如下:

This is a {demo} phrase made for {test}

我需要

demo  
test

注意:我的文字可以有多个{}块,而不是两个。例如:

This is a {demo} phrase made for {test} written in {English}

我将此表达式/{([^}]*)}/preg_match一起使用,但它只返回第一个单词,而不是文本中的所有单词。

4 个答案:

答案 0 :(得分:14)

改为使用preg_match_all

preg_match_all($pattern, $input, $matches);

preg_match大致相同,具有以下规定:

  

将所有匹配的主题搜索到中给出的正则表达式   模式并按标志指定的顺序将它们放入匹配项中。

     

找到第一个匹配后,继续进行后续搜索   在最后一场比赛结束时。

答案 1 :(得分:9)

您的表达式是正确的,但您应该使用preg_match_all()来检索所有匹配项。这是一个可行的例子:

$s = 'This is a {demo} phrase made for {test}';

if (preg_match_all('/{([^}]*)}/', $s, $matches)) {
        echo join("\n", $matches[1]);
}

要同时捕捉每个匹配的位置,您可以将PREG_OFFSET_CAPTURE作为第四个参数传递给preg_match_all。要使用它,您可以使用以下示例:

if (preg_match_all('/{([^}]*)}/', $s, $matches, PREG_OFFSET_CAPTURE)) {
        foreach ($matches[1] as $match) {
            echo "{$match[0]} occurs at position {$match[1]}\n";
        }
}

答案 2 :(得分:2)

由于{}是正则表达式匹配语法的一部分,因此您需要转义这些字符:

<?php
$text = <<<EOD
this {is} some text {from}
which I {may} want to {extract}
some words {between} brackets.
EOD;
preg_match_all("!\{(\w+)\}!", $text, $matches);
print_r($matches);
?>

产生

Array
(
    [0] => Array
        (
            [0] => {is}
            [1] => {from}
            [2] => {may}
            [3] => {extract}
            [4] => {between}
        )
     ... etc ...
)

此示例可能有助于理解在正则表达式中使用大括号:

<?php
$str = 'abc212def3456gh34ij';
preg_match_all("!\d{3,}!", $str, $matches);
print_r($matches);
?>

返回:

Array
(
    [0] => Array
        (
            [0] => 212
            [1] => 3456
        )
)

请注意,结果中不包含“34”,因为\d{3,}需要至少3个连续数字的匹配。

答案 3 :(得分:0)

使用RegEx匹配一对大括号之间的部分,不如使用Stack为此目的。使用RegEx会像“快速和脏的补丁”,但是对于解析和处理输入字符串,你必须使用堆栈。请访问here了解相关概念,here申请相同内容。