Подтвердить что ты не робот

Извлечение всех значений между фигурными фигурными скобками 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);
?>

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

4b9b3361

Ответ 1

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

<?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
)

Ответ 2

Два компактных решения не упоминались:

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

и

{\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 (?=}) утверждает, что следующим является закрывающая фигурная скобка.

Ссылка

Ответ 3

DEMO: 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