我的文字如下:
This is a {demo} phrase made for {test}
我需要
demo
test
注意:我的文字可以有多个{}
块,而不是两个。例如:
This is a {demo} phrase made for {test} written in {English}
我将此表达式/{([^}]*)}/
与preg_match
一起使用,但它只返回第一个单词,而不是文本中的所有单词。
答案 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)