Php 获取花括号中出现的所有单词

Php 获取花括号中出现的所有单词,php,regex,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一起使用,但它只返回第一个单词,而不是文本中的所有单词。请改用: 它与preg_match基本相同,但有以下规定: 在subje

我有这样一个文本:

This is a {demo} phrase made for {test}
我需要去

demo  
test
注意:我的文本可以有多个
{}
块,但不总是两个。例如:

This is a {demo} phrase made for {test} written in {English}
我将此表达式
/{([^}]*)}/
preg_match
一起使用,但它只返回第一个单词,而不是文本中的所有单词。

请改用:

它与
preg_match
基本相同,但有以下规定:

在subject中搜索与中给定的正则表达式的所有匹配项 模式,并按标志指定的顺序将它们放入匹配项中

找到第一个匹配项后,将继续后续搜索 从最后一场比赛结束开始


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

<?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);
?>
此示例可能有助于理解正则表达式中花括号的用法:

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

请注意,“34”被排除在结果之外,因为
\d{3,}
需要至少3个连续数字的匹配。

使用RegEx匹配大括号对之间的部分比使用Stack更好。使用正则表达式类似于“快速脏补丁”,但对于解析和处理输入字符串,必须使用堆栈。请访问以获取该概念并应用该概念。

您的表达式是正确的,但您应该使用来检索所有匹配项。下面是一个工作示例,展示了它的样子:

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

if (preg_match_all('/{([^}]*)}/', $s, $matches)) {
        echo join("\n", $matches[1]);
}
要捕获每个匹配的位置,可以将
PREG\u OFFSET\u capture
作为第四个参数传递给
PREG\u match\u all
。要使用它,可以使用以下示例:

if (preg_match_all('/{([^}]*)}/', $s, $matches, PREG_OFFSET_CAPTURE)) {
        foreach ($matches[1] as $match) {
            echo "{$match[0]} occurs at position {$match[1]}\n";
        }
}
Array
(
    [0] => Array
        (
            [0] => 212
            [1] => 3456
        )
)
$s = 'This is a {demo} phrase made for {test}';

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