Извлечение всех значений между фигурными фигурными скобками regex php

У меня есть контент в этой форме

$content ="<p>This is a sample text where {123456} and {7894560} ['These are samples']{145789}</p>"; 

Мне нужны все значения между фигурными фигурными скобками в массиве, подобном показанному ниже:

 array("0"=>"123456","1"=>"7894560","2"=>"145789") 

Я пробовал с этим кодом:

 <?php preg_match_all("/\{.*}\/s", $content, $matches); ?> 

Но я получаю здесь значения от первой фигурной скобки до последней, найденной в контенте. Что можно сделать, чтобы получить массив в формате выше? Я знал, что шаблон, который я использовал, ошибочен. Что нужно сделать, чтобы получить желаемый результат, показанный выше?

Сделайте так …

 <?php $content ="<p>This is a sample text where {123456} and {7894560} ['These are samples']{145789}</p>"; preg_match_all('/{(.*?)}/', $content, $matches); print_r(array_map('intval',$matches[1])); 

ВЫВОД :

 Array ( [0] => 123456 [1] => 7894560 [2] => 145789 ) 

Не были упомянуты два компактных решения:

 (?<={)[^}]*(?=}) 

а также

 {\K[^}]*(?=}) 

Они позволяют получить доступ к матчам напрямую, без групп захвата. Например:

 $regex = '/{\K[^}]*(?=})/m'; preg_match_all($regex, $yourstring, $matches); // See all matches print_r($matches[0]); 

объяснение

  • (?<={) Lookbehind утверждает, что предшествующий является открывающей скобкой.
  • В варианте 2 { соответствует открытой скобе, тогда \K сообщает движку отказаться от того, что было сопоставлено до сих пор. \K доступен в Perl, PHP и R (которые используют механизм PCRE ), а Ruby 2.0+
  • [^}] Отрицательный класс символов представляет собой один символ, который не является закрывающей фигурной скобкой,
  • и квантификатор * совпадает с нулем или более раз
  • Смотрище (?=}) Утверждает, что следующим является закрывающая фигурная скобка.

Справка

  • Условные обозначения Lookahead и Lookbehind Zero-Length
  • Освоение Lookahead и Lookbehind

ДЕМО: https://eval.in/84197

 $content ="<p>This is a sample text where {123456} and {7894560} ['These are samples']{145789}</p>"; preg_match_all('/{(.*?)}/', $content, $matches); foreach ($matches[1] as $a ){ echo $a." "; } 

Вывод:

 123456 7894560 145789