2014-11-05 83 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>';