Найти теги в тексте php

Поиск и замена текста между тегами на PHP

Рассмотрим примеры обработки и замены текста между HTML тегами, используя PHP функции для поиска и подмены по регулярным выражениям. Для примера возьмем абстрактный кусок кода, над которым будем проводить различные действия.

На месте может быть любой тег, а троеточие обозначает любой произвольный текст.

Поиск текста функцией «preg_match_all»

Для поиска текста внутри тегов воспользуемся функцией «preg_match_all». Зададим маску поиска и посмотрим, что она возвращает в качестве результата.

Функция preg_match_all возвращает «1» в случае нахождения в тексте соответствия с указанной маской или «0», если соответствий не найдено. В качестве параметров принимает маску, строку где ищем и переменную, в которую будут записаны найденные совпадения.

Маска поиска обрамляется символами «|». За ними идут директивы — «isU» обозначает регистронезависимый поиск в многострочном тексте с кодировкой «UTF-8»

В самом правиле содержатся теги, между которыми требуется заменить текст — «(.+)». Точка символизирует любой символ, а плюс — что он может повторяться один или больше раз. Скобки говорят о том, что содержимое между ними нужно записать в переменную с результатом.

Перебор найденных результатов в цикле «foreach»

Для вывода результатов поиска можно воспользоваться циклом «foreach».

На выходе получаем тоже самое что и в предыдущем примере, зато теперь мы автоматизировали перебор массива и сократили код.

Отличие «preg_match» от «preg_match_all»

Функция «preg_match» осуществляет поиск только до первого соответсвия с маской. Как только что-то найдено — поиск останавливается и возвращается одномерный массив.

Здесь нулевой элемент массива «$arr» содержит найденное совпадение вместе с тегами «title», а первый элемент — «$arr[1]» только текст между этими тегами. Если в строке несколько тегов «title», это не значит что остальные значения будут записаны в «$arr[2]» и так далее. Элемент «$arr[2]» окажется не пуст если в маске указано несколько правил, но об этом в следующий раз.

Замена текста между тегами функцией «preg_replace»

Если требуется найти и произвести замену найденных элементов в строке, то на помощь приходит PHP функция «preg_replace».

Заменим в нашем примере все имена между тегами на какое-то конкретное, например — «Оля».

Замена тегов, оставляя всё, что находится внутри

А теперь небольшой пример, показывающий как заменить определенные теги, сохранив содержимое между ними. Допустим, надо изменить в html коде все «strong» на CSS форматирование.

Обработка и замена при помощи «preg_replace_callback»

Переходим к самому интересному. Если нужно над найденным фрагметом произвести какие-то действия и только потом осуществить замену, то следует использовать «preg_replace_callback». Рассмотрим как с помощью этой функции в именах сделать первую букву заглавной.

В качестве параметров передаём маску поиска, функцию с кодом обработки и строковую переменную в которой осуществляем поиск. Дополнительно могут ещё быть заданы два необязательных параметра. О них в следующем разделе статьи.

Переменная «$matches» это массив, содержащий элементы регулярного выражения. В нулевом элементе будет содержаться вся исходная строка, а в остальных — содержимое скобок.

Код обработки не описываю, но отмечу что для замены первой буквы на заглавную я использую PHP функции для работы со строками в UTF-8 кодировке. Если у Вас кодировка cp1251, то нужно отбросить префикс «mb_» и удалить последний параметр у функций.

ВНИМАНИЕ! Код в примере будет работать только при использовании PHP версии 5.3 и выше. Для более поздних версий требуется доработка.

Использование нумирации в заменах и другие продвинутые возможности

Теперь немного о продвинутых возможностях функции «preg_replace_callback». Ранее я упоминал что у неё есть два необязательных параметра. Первый (по умолчанию равен «-1») содержит максимальное количество замен, которое должна произвести функция. Второй — переменная, в которую будет записано количество произведенных замен.

Задав эти два параметра в предыдущем примере, замена главной буквы будет произведена только у первых двух имён. Соответственно, переменная «$count» будет содержать — 2. Если установить первый дополнительный параметр в «-1», то «$count» будет — 3.

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

Для реализации может быть использована глобальная или статическая переменная. Использование глобальных переменных может быть отключено в PHP, поэтому рассмотрим пример со статической переменной. Присвоим всем тегам h2 уникальный идентификатор.

Объявляя статическую переменную нужно помнить что она сохраняет своё значение между вызовами функции, поэтому идеально подходит для решения нашей задачи.

Источник

Поиск и замена текста между тегами в PHP

Поиск текста между тегами

Допустим, у нас есть следующий текст:

Проще всего это сделать с помощью регулярных выражений:

Функция preg_match_all() принимает 3 параметра: шаблон поиска, сам текст и переменную, в которую эта функция сохранит результаты поиска.

Поскольку функция возвращает количество найденных строк (или false в случае ошибки), мы можем сразу подставить её в оператор if.

Простая замена текста или тегов (preg_replace)

Заменить текст без замены тегов можно следующим образом:

А в следующем примере меняются только теги, сам текст остаётся нетронутым:

Замена текста собственной функцией (preg_replace_callback)

Самое вкусное. Допустим, мы хотим использовать на сайте что-то вроде BBCode, т.е. собственные теги, которые потом должны заменяться на обычный HTML код:

Заменить тег

на обычный HTML тег

можно так:

Функция preg_replace_callback передаёт каждую найденную строку в нашу безымянную функцию, затем заменяет найденный текст на то, что наша функция возвращает.

Не знаком с безымянными функциями? Тогда можно сделать так:

Вторым параметром передаём название нашей функции. Код отработает точно также, как и предыдущий.

Вывод фрагментов исходного HTML и PHP кода

Теперь в этом нет ничего сложного:

Продвинутый BBCode с атрибутами

Иногда описанного выше функционала бывает недостаточно, например если нужно передать в функцию какие-либо параметры:

Вместо собственного велосипеда рекомендую использовать готовую библиотеку Shortcode.

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

Источник

PHP, регулярные выражения. Извлечение строк между тегами.

Здравствуйте! Моя задача получить одну таблицу (от ) из большой каши на html-е. Эта таблица отличается от массы остальных тем, что имеет в открывающем теге следующую запись:

Исходя из этого составляю соответствующий шаблон:

И в итоге получаю нуль. Причем хоть так, хоть так:

7 ответов 7

Однако, при желании можно решить данную задачу и при помощи регулярного выражения. Проблема со вложенными таблицами в данном случае решается при помощи рекурсивных выражений:

Найти теги в тексте php. Смотреть фото Найти теги в тексте php. Смотреть картинку Найти теги в тексте php. Картинка про Найти теги в тексте php. Фото Найти теги в тексте php

первый не подойдёт если внутри таблицы есть еще одна, вложенная таблица.

А второй вариант не подойдёт когда на странице есть 2 таблици паралельно.

Первое правило парсинга гласит: перед тем как смотреть что на выходе, посмотри что на входе (это моё правило, вывел его после таких долгих мучений 🙂 )

Поэтому посмотрите что вы таки парсить пытаетесь, скорее всего вы получаете не ту страницу что ожидаете, либо вообще пустой текст ( например запрещены исходящие запросы )

Раз уж завели речь о DOM парсерах:

должно работать с модификаторами «s» и «U»

Задача, прямо скажу, нетривиальная и простой регуляркой ее не решить. Есть два типа регулярных выражений: ленивые и жадные. Ленивое выражение может вытащить вам таблицу внутри нужной и первый кусок нужной таблицы, что явно мало. Жадное может вытащить нужную таблицу и еще полстраницы кода, что тоже неприемлимо. Напрашиваются два выхода:
1. использовать php-парсер, пропускать код через него и искать нужную таблицу методами класса
2. написать свою функцию, вытаскивающую все закрывающие и открывающие теги и запоминающую их вхождения. А потом надо будет пройтись по запомненным значениям и, имея начало и конец таблицы, вытащить все, что между.
Пока только такие идеи.

Источник

Поиск, обработка и замена текста между тегами на PHP

Найти теги в тексте php. Смотреть фото Найти теги в тексте php. Смотреть картинку Найти теги в тексте php. Картинка про Найти теги в тексте php. Фото Найти теги в тексте php

Поиск, обработка и замена текста между тегами на PHP

Сегодня возникла задача обработки уведомлений по шаблону с ключевыми словами. К примеру «Здравствуйте [[name]]!». Где name нужно заменить на имя пользователя в письме.

Сегодня я постараюсь объяснить как найти, обработать и заменить текст между тегами используя PHP функции. На первый взгляд простая задача, тем более в PHP есть специально предназначенные для этого функции, позволяющие использовать для поиска и замены регулярные выражения. Чтобы было проще разобраться, будем все делать на примерах. За основу возьмем абстрактный html код:

Здесь — представляет какой-то конкретный html тег, а троеточие — другие произвольные теги. Предлагаю постепенно начинать разбираться с возможностями PHP по работе со строками. Все пункты будем рассматривать на примерах.

Поиск текста функцией «preg_match_all»

Для поиска текста внутри тегов воспользуемся функцией «preg_match_all». Зададим маску поиска и посмотрим, что она возвращает в качестве результата.

В нулевой разряд массива записались значения с тегами, а в первый — только текст между ними. Если требуется вывести все найденные результаты, то лучше всего использовать цикл foreach, его рассмотрим ниже, а пока немного информации про функцию preg_match_all.

Она возвращает либо «1», в случае нахождения в тексте соответствия с указанной маской или «0» если соответствий не найдено. В качестве параметров функция принимает маску поиска, строковую переменную в которой будет осуществляться поиск и переменную типа двухмерный массив, в который будут записываться найденные совпадения.

Маска поиска текста между тегов обрамляется символом «|». Таких правил в маске может быть несколько. Для нашей задачи достаточно одного.

В правиле у нас содержатся теги, между которыми требуется заменить текст — «(.+)». Регулярное выражение указывает на то, что между ними может быть любое количество любых символов. Знак плюс означает что их должно быть больше нуля. То есть, если между тегами ничего нет, то результата никакого не получим. Если хотим найти даже те места, где между тегов нет никакого текста, то вместо плюса ставим знак звёздочки — «*». Директива «isU» обозначает регистронезависимый поиск в многострочном тексте кодировки «UTF-8».

Перебор найденных результатов в цикле «foreach»

Для вывода всех результатов поиска лучше всего воспользоваться циклом «foreach».

На выходе получаем тоже самое что и в предыдущем примере, зато теперь мы автоматизировали перебор массива и сократили код.

Отличие «preg_match» от «preg_match_all»

Разница заключается в том, что «preg_match» ищет только до первого совпадения с маской поиска. Как только что-то найдено, поиск останавливается. Так же разница в выдаваемом результате. «preg_match» возвращает одномерный массив. Вот пример.

В этом случае нулевой элемент массива «$arr» содержит найденное совпадение вместе с тегами «title», а первый элемент — «$arr[1]» только текст между этими тегами. И не путайте, если в искомом коде несколько тегов «title», это не значит что остальные значения будут записаны в «$arr[2]» и так далее. В случае с «preg_match» поиск идет только до первого найденного совпадения, а элемент «$arr[2]» окажется не пуст, только если в маске указано несколько правил, но об этом в следующий раз.

Замена текста между тегами функцией «preg_replace»

Если требуется не просто найти, но ещё и произвести замену найденных элементов в строке, то на помощь приходит PHP функция «preg_replace».

Давайте заменим в нашем примере все имена между тегами на какое-то конкретное, например — «Оля».

Замена тегов, оставляя всё, что находится внутри

А теперь небольшой пример, показывающий как заменить определенные теги, сохранив при этом содержимое между ними. Допустим, надо изменить в html коде все «strong» на CSS форматирование.

Обработка и замена при помощи «preg_replace_callback»

А теперь переходим к самому интересному. Что делать, если нужно над найденным фрагметом произвести какие-то действия и только потом осуществить замену? Конечно же использовать «preg_replace_callback». Для примера рассмотрим как в именах сделать первую букву заглавной.

В качестве параметров мы передаём маску поиска, функцию с кодом обработки и строковую переменную в которой осуществляем поиск. Дополнительно могут быть заданы ещё два необязательных параметра. О них в следующем разделе статьи.

Переменная «$matches» это массив, содержащий элементы регулярного выражения. В нулевом элементе будет содержаться вся исходная строка, а в остальных — содержимое скобок.

Код обработки не буду описывать, отмечу что для замены первой буквы на заглавную я использую PHP функции для работы со строками в UTF-8 кодировке. Если у вас кодировка cp1251, то нужно отбросить префикс «mb_» и удалить последний параметр у функций.

ВНИМАНИЕ! Код в примере будет работать только при использовании PHP версии 5.3 и выше. Для более поздних версий требуется доработка.

Использование нумирации в заменах и другие продвинутые возможности

Теперь немного о продвинутых возможностях функции «preg_replace_callback». Ранее я упоминал что у неё есть два необязательных параметра. Первый (по умолчанию равен «-1») содержит максимальное количество замен, которое должна произвести функция. Второй — переменная, в которую будет записано количество произведенных замен.

Задав эти два параметра в предыдущем примере, замена главной буквы будет произведена только у первых двух имён. Соответственно, переменная «$count» будет содержать — 2. Если установить первый дополнительный параметр в «-1», то «$count» будет — 3.

И в конце о том как узнать какая по счету замена происходит в данный момент. Это может потребоваться если появилась необходимость произвести замену между пятым и десятым найденным элементом строки или требуется для каких-то тегов прописать уникальные идентификаторы.

Для такой реализации может быть использована глобальная или статическая переменная. Использование глобальных переменных может быть отключено в PHP, поэтому рассмотрим пример со статической переменной. Присвоим всем тегам h2 уникальный идентификатор.

Объявляя статическую переменную нужно помнить что она сохраняет своё значение между вызовами функции, поэтому идеально подходит для решения нашей задачи.

ВНИМАНИЕ! Дополнительные параметры в «preg_replace_callback» появились начиная с PHP версии 5.1

1 оцените контент и участвуйте в выборе трендов

Источник

strip_tags

(PHP 4, PHP 5, PHP 7, PHP 8)

strip_tags — Удаляет теги HTML и PHP из строки

Описание

Список параметров

Второй необязательный параметр может быть использован для указания тегов, которые не нужно удалять. Они указываются как строка ( string ) или как массив ( array ) с PHP 7.4.0. Смотрите пример ниже относительно формата этого параметра.

Возвращаемые значения

Возвращает строку без тегов.

Список изменений

ВерсияОписание
8.0.0allowed_tags теперь допускает значение null.
7.4.0allowed_tags теперь альтернативно принимает массив ( array ).

Примеры

Пример #1 Пример использования strip_tags()

// Начиная с PHP 7.4.0, строка выше может быть записана как:
// echo strip_tags($text, [‘p’, ‘a’]);
?>

Результат выполнения данного примера:

Примечания

Эта функция не должна использоваться для предотвращения XSS-атак. Используйте более подходящие функции для этой задачи, такие как htmlspecialchars() или другие механизмы, в зависимости от контекста вывода.

Из-за того, что strip_tags() не проверяет валидность HTML, то частичные или сломанные теги могут послужить удалением большего количества текста или данных, чем ожидалось.

Смотрите также

User Contributed Notes 17 notes

Hi. I made a function that removes the HTML tags along with their contents:

Result for strip_tags($text):
sample text with tags

Result for strip_tags_content($text):
text with

Result for strip_tags_content($text, ‘‘):
sample text with

Result for strip_tags_content($text, ‘‘, TRUE);
text with

I hope that someone is useful 🙂

After upgrading from v7.3.3 to v7.3.7 it appears nested «php tags» inside a string are no longer being stripped correctly by strip_tags().

This is still working in v7.3.3, v7.2 & v7.1. I’ve added a simple test below.

A word of caution. strip_tags() can actually be used for input validation as long as you remove ANY tag. As soon as you accept a single tag (2nd parameter), you are opening up a security hole such as this:

Plus: regexing away attributes or code block is really not the right solution. For effective input validation when using strip_tags() with even a single tag accepted, http://htmlpurifier.org/ is the way to go.

Since strip_tags does not remove attributes and thus creates a potential XSS security hole, here is a small function I wrote to allow only specific tags with specific attributes and strip all other tags and attributes.

If you only allow formatting tags such as b, i, and p, and styling attributes such as class, id and style, this will strip all javascript including event triggers in formatting tags.

Note that allowing anchor tags or href attributes opens another potential security hole that this solution won’t protect against. You’ll need more comprehensive protection if you plan to allow links in your text.

a HTML code like this:

$str = ‘color is bluesize is huge
material is wood’;

$str = ‘color is blue size is huge material is wood’;

«5.3.4 strip_tags() no longer strips self-closing XHTML tags unless the self-closing XHTML tag is also given in allowable_tags.»

This is poorly worded.

The above seems to be saying that, since 5.3.4, if you don’t specify «
» in allowable_tags then «
» will not be stripped. but that’s not actually what they’re trying to say.

What it means is, in versions prior to 5.3.4, it «strips self-closing XHTML tags unless the self-closing XHTML tag is also given in allowable_tags», and that since 5.3.4 this is no longer the case.

So what reads as «no longer strips self-closing tags (unless the self-closing XHTML tag is also given in allowable_tags)» is actually saying «no longer (strips self-closing tags unless the self-closing XHTML tag is also given in allowable_tags)».

pre-5.3.4: strip_tags(‘Hello World

‘,’
‘) => ‘Hello World
‘ // strips
because it wasn’t explicitly specified in allowable_tags

5.3.4 and later: strip_tags(‘Hello World

‘ // does not strip
because PHP matches it with
in allowable_tags

Note the different outputs from different versions of the same tag:

Features:
* allowable tags (as in strip_tags),
* optional stripping attributes of the allowable tags,
* optional comment preserving,
* deleting broken and unclosed tags and comments,
* optional callback function call for every piece processed allowing for flexible replacements.

Caution: the function doesn’t fully validate tags (the more so HTML itself), it just force strips those obviously broken (in addition to stripping forbidden tags). If you want to get valid tags then use strip_attrs option, though it doesn’t guarantee tags are balanced or used in the appropriate context. For complex logic consider using DOM parser.

Here is a recursive function for strip_tags like the one showed in the stripslashes manual page.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *