удалить все что между тегами php
Как удалить текст между тегами в PHP?
несмотря на использование PHP в течение многих лет, я никогда не учился правильно использовать выражения для усечения строк. который теперь кусает меня в зад!
кто-нибудь может оказать мне помощь усек это? Мне нужно вырезать текстовую часть из url-адреса, повернув
6 ответов
как насчет чего-то подобного, учитывая, что вы можете захотеть повторно использовать его с другими href s:
Если вам не нужно соответствовать любому другому href, вы можете использовать что-то вроде :
, который также поможет вам :
Как sidenote : для более сложного HTML не пытайтесь использовать регулярные выражения: они отлично работают для такой простой ситуации, но для реальной HTML-части они действительно не помогают, в общем : HTML не совсем «регулярен», «достаточно», чтобы быть проанализированным regexes.
вы можете использовать подстроку в сочетании со stringpos, хотя это не так очень хороший подход.
другим способом было бы написать регулярное выражение, соответствующее вашим критериям. Но для того, чтобы ваша проблема была решена быстро, будут использоваться строковые функции.
EDIT: я недооценил аудиторию. 😉 Продолжайте с regexes. ^^
вам не нужно захватывать сами теги. Просто выделите текст между тегами и замените его пустой строкой. Очень просто.
или в крайних случаях, когда текст ссылки содержит используйте этот:
это позволяет избежать расходов групп захвата с помощью ленивого квантора, перезапуск fullstring \K и «lookahead».
Поиск и замена текста между тегами на 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 уникальный идентификатор.
Объявляя статическую переменную нужно помнить что она сохраняет своё значение между вызовами функции, поэтому идеально подходит для решения нашей задачи.
strip_tags
(PHP 4, PHP 5, PHP 7, PHP 8)
strip_tags — Удаляет теги HTML и PHP из строки
Описание
Список параметров
Второй необязательный параметр может быть использован для указания тегов, которые не нужно удалять. Они указываются как строка ( string ) или как массив ( array ) с PHP 7.4.0. Смотрите пример ниже относительно формата этого параметра.
Возвращаемые значения
Возвращает строку без тегов.
Список изменений
Версия | Описание |
---|---|
8.0.0 | allowed_tags теперь допускает значение null. |
7.4.0 | allowed_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.
Как удалить текст между тегами в php?
Несмотря на использование PHP в течение многих лет, я никогда не научился использовать выражения для правильной усечения строк …, которые теперь кусают меня сзади!
Может ли кто-нибудь предоставить мне некоторую помощь, усекающую это? Мне нужно вырезать текстовую часть из URL-адреса, поворачивая
Что-то вроде этого, учитывая, что вы захотите повторно использовать его с другими href s:
Который доставит вас:
(Я рассматриваю, что вы сделали опечатку в OP?)
Если вам не нужно сопоставлять другие href, вы можете использовать что-то вроде:
Который также получит вас:
В качестве побочного элемента: для более сложного HTML не пытайтесь использовать регулярные выражения: они отлично подходят для такой простой ситуации, но для реальной части HTML-кода они действительно не помогают, в общем: HTML не довольно «регулярный» «достаточно», чтобы анализировать регулярные выражения.
Вы можете использовать подстроку в сочетании со строками, хотя это не очень хороший подход.
Проверить: PHP Manual – Строковые функции
Другой способ – написать регулярное выражение, соответствующее вашим критериям. Но чтобы быстро решить вашу проблему, строковые функции будут …
EDIT: Я недооценил аудиторию. 😉 Продолжайте с регулярными выражениями … ^^
Вам не нужно захватывать сами теги. Просто настройте текст между тегами и замените его пустой строкой. Супер простой.
Это позволяет избежать затрат на группы захвата, используя ленивый квантификатор, перезапуск fullstring \K и «lookahead».
Убрать все что находиться между тегами скрипт
Подробно об удалении содержания внутри тега
Удаляем текст внутри тега javascript
С самого начала, что может быть внутри тега и где это внутри тега!?
Удаляем между тегами javascript
Начнем с самого простого! нам потребуется:
Результат удаления содержания внутри тегов:
Разместим данный код прямо здесь, нажмите по строке с текстом.
Давайте сделаем тоже самое, только с кнопкой. логика аналогичная, только кода чуть побольше.
Опять div, покрасим текст, который будем удалять внутри тегов в красный, чтобы его было видно, + добавим id, чтобы можно было обратиться к тегу
Добавим кнопку button, по которой будем нажимать.
Удали контент внутри тега
Добавим скрипт, который удалит все содержание между тегами:
Удали контент внутри тега
Пример удаления содержания между тегов с помощью javascript
Удаляем текст внутри тега jQuery
Далее разберем простой пример, как удалить содержание между тегами с помощью jQuery
Удали контент внутри тега
Разметим выше приведенный код прямо здесь:
Удаляем текст внутри тега php
Ваш текст должен быть в переменной:
Далее нам понадобится проверить получение post с условием if
Внутри условия заменяем содержание между тегами:
Соберем простую форму, она нам понадобится для того, чтобы увидеть удаление содержания между тегами после перезагрузки.