preg_math_all | PHP | регулярные выражение | строки

314
07 декабря 2017, 01:46

Имеется строка: [HOST]127.0.0.1[/HOST][LOGIN]root[/LOGIN] Дальше продолжать смысла нет.

Имеется строка, необходимо из вот этих самописных тегов, взять значения.

Пробовал preg_match_all не получалось ничего.

Кто знает как это можно организовать???

В интернете вообще нету информации по preg_match есть только примеры, но объяснений как это работает - нету. Поэтому и сложно в понимании.

Answer 1

В документации особо не расписано, как именно писать регулярные выражение, потому что они одинаковые везде, не только в пхп. Поэтому лишь рассказывает о функциях работы с ними, предполагается что синтаксис самих регулярок вы должны знать.

Можете попробовать следующий вариант кода:

$text = "[HOST]127.0.0.1[/HOST][LOGIN]root[/LOGIN]";
preg_match_all('/\[(?<tag>\w+)\](?<value>.*?)\[\/\1\]/iu', $text, $matches);

$result = array_combine($matches['tag'], $matches['value']);
print_r($result);

результатом работы будет

Array (
   [HOST] => 127.0.0.1
   [LOGIN] => root
)

Возьмем все выражение целиком: \[(?<tag>\w+)\](?<value>.*?)\[\/\1\]
Возможно, вы знаете что группы соотвествий заключаются в круглые скобки. Данные группы можно именовать, и имена групп задаются с помощью конструкции как тут ?<tag> или ?<value>. Это будут ключи соответствий в результирующем массиве $matches.

Опустим эти имена, и наше выражение будет следующим \[(\w+)\](.*?)\[\/\1\], что становится куда короче.
Первая часть \[(\w+)\]. Поскольку символы [] имеют в руглярках свое знание, то они экранированы. Между ними остается группа (\w+), где скобки обозначают саму группу захвата, а \w+ соответствуют 1 и более символов из набора a-z0-9_.

В конце регулякри присутствует \[\/\1\], здесь помимо [] также экранируется и закрывающий слэш тэга /. Далее имеется \1, это называется обратной ссылкой и говорит о том, что текст должн соответствовать первой группе захвата, то есть тексту открывающего тэга.

Ну и наконец в середине (.*?), здесь также скобки означают группу захвата. Точка . обозначает любой символ. * обозначает что число символов от 0 и более. Знак вопроса ? это модификатор жадности поиска, с ним результат будет содержать минимальную строку.

сама регулярка ограничивается символами / (или другими, т.е. /текст регулярки/) и имеет модификаторы iu(регистронезависимый поиск с учетом юникода).

Answer 2

Для разбора строк с известным заранее форматом можно использовать функцию sscanf (это такой, своеобразный, printf наоборот)

Т.е. в вашем случае так

sscanf($input, "[HOST]%s[/HOST][LOGIN]%s[/LOGIN]", $host, $login);

Соответственно в $host и $login будут помещены значения соответствующих %s.

PS У нее есть некоторые нюансы использования, так что рекомендую тщательно изучить документацию в части правил разбора модификаторов

READ ALSO
Помощь в доработке функционала сайта Wordpress

Помощь в доработке функционала сайта Wordpress

Есть готовый сайт для заказа печати книг, сделан на Wordpress WoocommerceЗагрузка макетов для печати происходит через плагин "N-Media File Upload and Manager" в формате...

230
Почему PHP высылаем сразу два JSON масива?

Почему PHP высылаем сразу два JSON масива?

Когда я шлю запрос с JSON параметром на PHP скрипт то он почему-то возврасщает мне и старый и новый, в PHP сгенерированый масивКто может подсказать...

238
Потеря .docx при загрузке на/с сервера на php

Потеря .docx при загрузке на/с сервера на php

Есть два скрипта1- закачивает с формы файл на сервер

244