我的言語都出現文字,如:獲取大括號
This is a {demo} phrase made for {test}
我需要得到
demo
test
注:我的文字可以有{}
多個塊,並不總是二。例如:
This is a {demo} phrase made for {test} written in {English}
我用這個表達/{([^}]*)}/
與preg_match
但它只返回的第一個字,而不是文本中的所有單詞。
我的言語都出現文字,如:獲取大括號
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_all
代替:
preg_match_all($pattern, $input, $matches);
這是大致相同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);
?>
產生
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個連續位的。
您的表達是正確的,但您應該使用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";
}
}
完美,謝謝 –