У меня есть строка, где некоторая часть строки находится внутри фигурных скобок, и я хотел бы получить их в массиве.
Lorem {{ipsum}} dolor sit amet, {{consectetur}} adipiscing elit.
является, например: 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."));
но я возвращаю заданную строку как результат
Вы используете неправильную функцию, вы должны использовать preg_match_all()
.
Вы также должны использовать ленивый, а не жадный совпадение, чтобы избежать результата ipsum}} dolor sit amet, {{consectetur
. Вы можете сделать это, добавив ?
после вашего квантификатора:
$regExp = "/\{\{([^)]+?)\}\}/";
^ here
preg_match_all($regExp, "Lorem {{ipsum}} dolor sit amet, {{consectetur}} adipiscing elit.",
$result);
var_dump($result);
Используйте 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>';
.+?
будет делать так же хорошо, как[^)]+?
, Тем не менее, я предполагаю, что ОП использует его по какой-то причине, поэтому я скопировал его выражение, чтобы не нарушать другие вещи, которые мы здесь не видим.