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

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

3 ответов


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

<?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 engine) и Ruby 2.0+
  • на [^}] отрицаемый класс символов представляет один символ, который не является закрывающей скобкой,
  • и * квантификатор соответствует этому нулю или более раз
  • lookahead (?=}) утверждает, что ниже следует закрывающая скобка.

ссылка


демо: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