Php получить текст между тегами
1 2 3 4 5 6 7 8 9 10 11 |
<?php $str = '<div class="content"> Есть блок с некоторым текстом. Блок может содержать различные символы, переносы строк... Как получить текст между тегами? </div>'; preg_match_all('#<div class="content">(.+?)</div>#is', $str, $arr); print_r($arr[1]); ?> |
Используемые модификаторы шаблона (символы после закрывающего разделителя # в конце шаблона):
i (PCRE_CASELESS)
– Если этот модификатор используется, символы в шаблоне соответствуют символам как верхнего, так и нижнего регистра. Т.е. будет осуществляться регистро-независимый поиск.
И в нашем примере будет найден и текст между тегами
<DIV CLASS="CONTENT">...</DIV>
s (PCRE_DOTALL)
– Если данный модификатор используется, метасимвол “точка” в шаблоне соответствует всем символам, включая перевод строк. Без него – всем, за исключением переводов строк
Итак,
. (точка) – любой символ (в том числе и перенос строки, поскольку используется модификатор s)
+ – означает повтор один и более раз.
Т.е. .+ – любой символ повторяется один или более раз. Данная конструкция попытается найти и захватить максимальное число любых символов, т.е. до последнего закрывающего </div>, согласно нашего шаблона. Но, данная ситуация нас не устроит, поскольку на странице будут еще блоки с закрывающимся тегом </div>, содержимое которых нам не нужно. Данная проблема решается с помощью квантификатора ? – знак вопроса.
? – убирает “жадность” квантификатора, стоящего перед ним.
Т.е. .+?</div> найдет любые символы до первого </div>, без знака вопроса эта конструкция искала бы до последнего </div>.
А с помощью скобок () мы указываем подмаску нашего шаблона. После выполнения поиска по заданному шаблону, arr[0] будет содержать массив полных вхождений шаблона, а элемент arr[1] – массив строк, содержащихся между данными тегами, т.е. тот самый текст, который нам нужно было получить.
Да, пригодилось, полезный пример! Спасибо!
Спасибо, очень пригодилось!
Спасибо автору и комментаторам! Долго парился, но когда нашёл, всё заработало!
Я хотел бы несколько дополнить сказанное.
Да на выходе мы получаем массив $arr[1], однако же для удобства дальнейшей работы я предлагаю этот массивчик преобразовать в одну строку, например так:
$my_str = implode(”, $arr[1]);
Это не всегда, конечно полезно, но…
В моем случае я вырезал текст с html кодом из определенного тега с определенным Id (типа …некий html…), и вставлял сразу целой строкой в другое нужное мне место.
Повторюсь, задача была специфической, но может кому пригодится…
Отлично!) Спасибо, с шаблонами у меня чет туго )) давно искал как задать любой символ )) вот эта штука (.+?) по видимому то что я искал СПС еще раз!
Спасибо за пример, когда то очень долго провозился с таким вопросом.
В данном случае не надо: регулярное выражение обрамлено диезами, а не слешами.
В регэкспе надо экранировать прямой слеш