- Поиск и замена текста между тегами на PHP
- Поиск текста функцией «preg_match_all»
- Перебор найденных результатов в цикле «foreach»
- Отличие «preg_match» от «preg_match_all»
- Замена текста между тегами функцией «preg_replace»
- Замена тегов, оставляя всё, что находится внутри
- Обработка и замена при помощи «preg_replace_callback»
- Использование нумирации в заменах и другие продвинутые возможности
- Наташа
- Катя
- (.+)
- '.$matches[1].'
- strip_tags
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Примечания
- Смотрите также
- Как убрать html теги из текста
- Как убрать html теги из текста с помощью fgetss()
- Убираем html-теги с помощью онлайн сервиса
- Замена символов
Поиск и замена текста между тегами на PHP
Рассмотрим примеры обработки и замены текста между HTML тегами, используя PHP функции для поиска и подмены по регулярным выражениям. Для примера возьмем абстрактный кусок кода, над которым будем проводить различные действия.
На месте может быть любой тег, а троеточие обозначает любой произвольный текст.
Поиск текста функцией «preg_match_all»
Для поиска текста внутри тегов воспользуемся функцией «preg_match_all». Зададим маску поиска и посмотрим, что она возвращает в качестве результата.
$sContent = ".наташа .даша .настя . "; if (preg_match_all('|(.+) |isU', $sContent, $arr)) < echo $arr[0][0] . " " . $arr[0][1] . " " . $arr[0][2] . "
"; echo $arr[1][0] . " " . $arr[1][1] . " " . $arr[1][2]; > //на выходе получаем: //наташа даша настя //наташа даша настя
В нулевой разряд массива записались значения с тегами, а в первый — только текст между ними. Если требуется автоматизировать вывод всего найденного, то лучше использовать цикл foreach . Его рассмотрим ниже.
Функция preg_match_all возвращает «1» в случае нахождения в тексте соответствия с указанной маской или «0», если соответствий не найдено. В качестве параметров принимает маску, строку где ищем и переменную, в которую будут записаны найденные совпадения.
Маска поиска обрамляется символами «|». За ними идут директивы — «isU» обозначает регистронезависимый поиск в многострочном тексте с кодировкой «UTF-8»
В самом правиле содержатся теги, между которыми требуется заменить текст — «(.+)». Точка символизирует любой символ, а плюс — что он может повторяться один или больше раз. Скобки говорят о том, что содержимое между ними нужно записать в переменную с результатом.
Перебор найденных результатов в цикле «foreach»
Для вывода результатов поиска можно воспользоваться циклом «foreach».
$sContent = ".Наташа .Марина .Настя . "; if (preg_match_all('|(.+) |isU', $sContent, $arr)) < foreach ($arr[0] as $value) echo $value." "; echo "
"; foreach ($arr[1] as $value) echo $value." "; >
На выходе получаем тоже самое что и в предыдущем примере, зато теперь мы автоматизировали перебор массива и сократили код.
Отличие «preg_match» от «preg_match_all»
Функция «preg_match» осуществляет поиск только до первого соответсвия с маской. Как только что-то найдено — поиск останавливается и возвращается одномерный массив.
if (preg_match('||isU', $sContent, $arr)) return $arr[1]; else return false;
Здесь нулевой элемент массива «$arr» содержит найденное совпадение вместе с тегами «title», а первый элемент — «$arr[1]» только текст между этими тегами. Если в строке несколько тегов «title», это не значит что остальные значения будут записаны в «$arr[2]» и так далее. Элемент «$arr[2]» окажется не пуст если в маске указано несколько правил, но об этом в следующий раз.
Замена текста между тегами функцией «preg_replace»
Если требуется найти и произвести замену найденных элементов в строке, то на помощь приходит PHP функция «preg_replace».
Заменим в нашем примере все имена между тегами на какое-то конкретное, например — «Оля».
$sContent = "наташа .даша .настя "; $sContent = preg_replace('|().+( )|isU', "$1"."Оля"."$2",$sContent);
Замена тегов, оставляя всё, что находится внутри
А теперь небольшой пример, показывающий как заменить определенные теги, сохранив содержимое между ними. Допустим, надо изменить в html коде все «strong» на CSS форматирование.
$sContent = ". Настя . "; $sContent = preg_replace('||isU', '', $sContent); //на выходе получаем $sContent: //. Настя .
Обработка и замена при помощи «preg_replace_callback»
Переходим к самому интересному. Если нужно над найденным фрагметом произвести какие-то действия и только потом осуществить замену, то следует использовать «preg_replace_callback». Рассмотрим как с помощью этой функции в именах сделать первую букву заглавной.
наташа .даша .настя "; echo htmlspecialchars($sContent); echo "
"; $sContent = preg_replace_callback('|()(.+)( )|iU', function($matches) < $matches[2] = mb_substr(mb_strtoupper($matches[2], 'UTF-8'),0,1,'UTF-8').substr($matches[2], 2); return $matches[1].$matches[2].$matches[3]; >,$sContent); echo htmlspecialchars($sContent); ?>
В качестве параметров передаём маску поиска, функцию с кодом обработки и строковую переменную в которой осуществляем поиск. Дополнительно могут ещё быть заданы два необязательных параметра. О них в следующем разделе статьи.
Переменная «$matches» это массив, содержащий элементы регулярного выражения. В нулевом элементе будет содержаться вся исходная строка, а в остальных — содержимое скобок.
Код обработки не описываю, но отмечу что для замены первой буквы на заглавную я использую PHP функции для работы со строками в UTF-8 кодировке. Если у Вас кодировка cp1251, то нужно отбросить префикс «mb_» и удалить последний параметр у функций.
ВНИМАНИЕ! Код в примере будет работать только при использовании PHP версии 5.3 и выше. Для более поздних версий требуется доработка.
Использование нумирации в заменах и другие продвинутые возможности
Теперь немного о продвинутых возможностях функции «preg_replace_callback». Ранее я упоминал что у неё есть два необязательных параметра. Первый (по умолчанию равен «-1») содержит максимальное количество замен, которое должна произвести функция. Второй — переменная, в которую будет записано количество произведенных замен.
$sContent = preg_replace_callback('|()(.+)( )|iU', function($matches) < //тут код >,$sContent,2,$count);
Задав эти два параметра в предыдущем примере, замена главной буквы будет произведена только у первых двух имён. Соответственно, переменная «$count» будет содержать — 2. Если установить первый дополнительный параметр в «-1», то «$count» будет — 3.
И в конце о том, как узнать какая по счету замена происходит в данный момент. Это может потребоваться если появилась необходимость произвести замену между пятым и десятым найденным элементом строки или требуется для каких-то тегов прописать уникальные идентификаторы.
Для реализации может быть использована глобальная или статическая переменная. Использование глобальных переменных может быть отключено в PHP, поэтому рассмотрим пример со статической переменной. Присвоим всем тегам h2 уникальный идентификатор.
Марина АлёшаНаташа
Катя
'; $str = preg_replace_callback('|(.+)
|iU', function($matches)< static $id = 0; $id++; return ''.$matches[1].'
'; >, $str,-1,$count); echo $str.' Количество замен: '.$count; ?>
Объявляя статическую переменную нужно помнить что она сохраняет своё значение между вызовами функции, поэтому идеально подходит для решения нашей задачи.
strip_tags
Эта функция пытается возвратить строку str , из которой удалены все NULL-байты, HTML и PHP теги. Для удаления тегов используется тот же автомат, что и в функции fgetss() .
Список параметров
Второй необязательный параметр может быть использован для указания тегов, которые не нужно удалять.
Замечание:
Комментарии HTML и PHP-теги также будут удалены. Это жестко записано в коде и не может быть изменено с помощью параметра allowable_tags .
Замечание:
Этот параметр не должен содержать пробелов. strip_tags() рассматривает тег как нечувствительную к регистру строку, находящуюся между и первым пробелом или >.
Замечание:
В PHP 5.3.4 и новее также необходимо добавлять соответвующий закрывающий тег XHTML, чтобы удалить тег из str . Например, для удаления и и
нужно сделать следующее:
Возвращаемые значения
Возвращает строку без тегов.
Список изменений
Версия | Описание |
---|---|
5.3.4 | strip_tags() больше не удаляет соответвующие закрывающие XHTML теги, если они не переданы в allowable_tags . |
5.0.0 | strip_tags() теперь безопасна для обработки бинарных данных. |
Примеры
Пример #1 Пример использования strip_tags()
Результат выполнения данного примера:
Примечания
Из-за того, что strip_tags() не проверяет валидность HTML, то частичные или сломанные теги могут послужить удалением большего количества текста или данных, чем ожидалось.
Эта функция не изменяет атрибуты тегов, разрешенных с помощью allowable_tags , включая такие атрибуты как style и onmouseover, которые могут быть использованы озорными пользователями при посылке текста, отображаемого также и другим пользователям.
Замечание:
Имена тегов в HTML превышающие 1023 байта будут рассматриваться как невалидные независимо от параметра allowable_tags .
Смотрите также
Как убрать html теги из текста
От автора: допустим, у вас есть кусок кода с каким-то содержимым, а вам нужно получить из него только текст. Вручную удалять все теги может быть очень долго и нудно, поэтому давайте разбираться, как с помощью php убрать html теги.
Если вам надо убрать из текста html-теги, то вам может пригодиться одна php-функция, которая хорошо справляется с этим заданием. Что она делает? Мы ей передаем нужную строку с кодом, а она вырезает оттуда все html и php-команды, возвращая содержимое без кода. Это функция strip_tags, которая имеет один обязательный и один необязательный параметры.
Соответственно, давайте сразу же протестируем ее работу.
Онлайн курс по JavaScript
Научитесь создавать приложения со сложными интерфейсами
Это основной язык для современной веб-разработки — почти 100% сайтов работает на JavaScript. Освойте его с нуля всего за 4 месяца, и вы сможете зарабатывать от 70 000 рублей.
$random = ‘
Это текст в абзаце
‘ ;
На экран выведется фраза “Это текст в абзаце”. Соответственно, вторым параметром можно задать те теги, которые не нужно удалять.
$random = ‘
Это слова в пустом строчном спане
‘ ;
В этой случае мы запретили функции удалять тег span и на экран он выведется вместе с текстом. Я думаю, основная цель strip_tags вам понятна. Если в коде присутствуют комментарии, то они тоже будут удалены. Но что, если удалить теги надо из целого файла? Для этого есть другая команда, которую рассмотрим далее.
Как убрать html теги из текста с помощью fgetss()
Эта команда отличается от предыдущей тем, что позволяет убрать html теги из всего файла. Для этого его предварительно необходимо открыть с помощью fopen(), в которой указывается путь до файла и режим, котором будет работа с ним.
Сама функция fgetss содержит три параметра. Первым является указатель на файл, с которого надо убирать лишнее. Второй параметр – длина получаемых данных, можно увидеть в блокноте или любом текстовом редакторе. Записывается в виде числового значения. Третий и необязательный параметр – разрешенные теги, которые не будут удалены. Этот параметр записывается также, как и для функции strip_tags.
Что мы в данном случае сделали:
Открыли файл “file.php”, сделав его доступным для чтения
Метод feof() проверяет, достигнут ли конец файла
По нашему условию, если конец файла достигнут, то с помощью функции fgetss() обрабатываем файл и выводим на экран всю информацию в новой переменной.
После этого файл закрывается. Пользоваться функцией есть смысл, когда необходимо удалить теги из файла, где их может быть сотни.
Убираем html-теги с помощью онлайн сервиса
Возможно, у вас нет желания пользоваться возможностями php для очищения текста от ненужных элементов. Что ж, есть способ гораздо более простой. Это онлайн сервис 0en.ru, который может удалять html дескрипторы и комментарии из скопированного в поле текста. С его помощью можно получить чистый текст уже через несколько секунд.
Единственный минус веб-сервиса в том, что он удаляет абсолютно все, поэтому если вы хотите какие-то из них оставить, то лучше все-таки воспользоваться одной из функций PHP.
Замена символов
Ну а что, если вам нужно удалить всего лишь 1-2 тега на странице. Сделать это еще проще. В любом нормальном текстовом редакторе есть функция “найти и заменить”. В первое поле вы вписываете символы, которые нужно найти (нужный нам открывающий тег), а во второе – на что его заменить. Здесь просто оставляем пустое место. Клац, и все удалилось. Соответственно, если тег парный, то нужно не забыть удалить и его закрывающую часть.
Онлайн курс по JavaScript
Научитесь создавать приложения со сложными интерфейсами
Это основной язык для современной веб-разработки — почти 100% сайтов работает на JavaScript. Освойте его с нуля всего за 4 месяца, и вы сможете зарабатывать от 70 000 рублей.
Сегодня мы с вами узнали несколько способов удаления html тегов из текста. Используйте если надо и читайте наш блог, чтобы узнавать еще больше о веб-технологиях.