Извлечение всех значений между регулярными выражениями в фигурных скобках 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);
?>
Но я получаю здесь значения от первой фигурной скобки до последней, найденной в содержимом. Что можно сделать, чтобы получить массив в указанном выше формате? Я знал, что шаблон, который я использовал, неправильный. Что нужно сделать, чтобы получить желаемый результат, показанный выше?
12
Author: Ganesh Babu, 2013-12-30
3 answers
Делай вот так...
<?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
)
18
Author: Shankar Damodaran, 2013-12-30 11:35:26
Два компактных решения не были упомянуты:
(?<={)[^}]*(?=})
И
{\K[^}]*(?=})
Они позволяют вам получать доступ к совпадениям напрямую, без групп захвата. Например:
$regex = '/{\K[^}]*(?=})/m';
preg_match_all($regex, $yourstring, $matches);
// See all matches
print_r($matches[0]);
Объяснение
-
(?<={)
Взгляд сзади утверждает, что то, что предшествует, является открывающей скобкой. - В варианте 2
{
соответствует открывающей скобке, затем\K
сообщает движку отказаться от того, что было согласовано до сих пор.\K
доступен на Perl, PHP и R (которые используютPCRE
движок) и Ruby 2.0+ - Класс отрицаемых символов
[^}]
представляет один символ, который не является закрывающей скобкой, - и квантор
*
соответствует этому нулю или более раз - Заголовок
(?=})
утверждает, что то, что следует, является закрывающей скобкой.
Ссылка
17
Author: zx81, 2014-06-27 03:24:00
ДЕМОНСТРАЦИЯ: 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
1
Author: Awlad Liton, 2013-12-30 11:39:13