2014-11-05 103 views
0

我有一個字符串,其中一部分字符串位於花括號內,我想將它們放入數組中。獲取雙花括號內的字符串

的字符串,例如:Lorem {{ipsum}} dolor sit amet, {{consectetur}} adipiscing elit.

而且我想獲得:array("ipsum", "consectetur")

我嘗試這樣做:

$regExp = "/\{\{([^)]+)\}\}/"; 
$result = preg_grep($regExp, array("Lorem {{ipsum}} dolor sit amet, {{consectetur}} adipiscing elit.")); 

,但我回來給定的字符串作爲結果

+3

使用此正則表達式'\ {\ {\ K [^ {}] *(?=}})''中功能preg_match_all'。 http://regex101.com/r/hQ9dW1/1 – 2014-11-05 16:07:22

回答

2

您正在使用錯誤的功能,您應該使用preg_match_all()

您還應該使用lazy代替貪婪匹配,以避免結果爲ipsum}} dolor sit amet, {{consectetur。你可以做你的量詞後加入?

$regExp = "/\{\{([^)]+?)\}\}/"; 
        ^here 
preg_match_all($regExp, "Lorem {{ipsum}} dolor sit amet, {{consectetur}} adipiscing elit.", 
       $result); 

var_dump($result); 

一個working example

+0

這與我的解決方案非常相似...只是一個問題:爲什麼你需要[^]]部分?爲什麼你想排除一個右括號? – 2014-11-05 16:14:27

+0

@TiborB。其實,你不需要它。在這種情況下,'。+?'會和'[^)] +?'一樣好。但是,我認爲OP使用它是有原因的,所以我複製了他的表達以避免破壞我們在這裏看不到的其他東西。 – jeroen 2014-11-05 16:16:49

+0

啊,好吧。我以爲我錯過了一些東西。 – 2014-11-05 16:32:45

1

使用preg_match_all()代替preg_grep

$str = 'Lorem {{ipsum}} dolor sit amet, {{consectetur}} adipiscing elit'; 
preg_match_all('!\{(\w+)\}!', $str, $m); 
$result = array_map(function($v){return trim($v, '{}');},$m[0]); 

print '<pre>'; 
print_r($result); 
print '</pre>';