- Php избавиться от html тегов
- Описание string strip_tags ( string str [, string allowable_tags] )
- strip_tags — Удаляет HTML и PHP-теги из строки
- Описание
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Примечания
- Смотрите также
- Удаление из строки HTML тегов в PHP
- Полная очистка текста от html-тегов
- Удаление отдельных html-тегов из текста
- Как убрать html теги из текста
- Как убрать html теги из текста с помощью fgetss()
- Убираем html-теги с помощью онлайн сервиса
- Замена символов
- strip_tags
- Описание
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Примечания
- Смотрите также
- User Contributed Notes 17 notes
Php избавиться от html тегов
(PHP 3 >= 3.0.8, PHP 4, PHP 5)
strip_tags — Удаляет HTML и PHP тэги из строки
Описание string strip_tags ( string str [, string allowable_tags] )
Эта функция возвращает строку str , из которой удалены HTML и PHP тэги. Для удаления тэго используется автомат, аналогичный примененному в функции fgetss() .
Необязательный второй аргумент может быть использован для указания тэгов, которые не должны удаляться.
Замечание: Аргумент allowable_tags был добавлен в PHP 3.0.13 и PHP 4.0b3. С версии PHP 4.3.0 удаляются также HTML комментарии.
Внимание | ||||||||||||
Внимание | |||||||||||
Версия | Описание |
---|---|
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 .
Смотрите также
- htmlspecialchars() — Преобразует специальные символы в HTML-сущности
Источник
Удаление из строки HTML тегов в PHP
Задача удалять все или только определенные html-теги из строки часто возникает там, где необходимо предоставить возможность любому посетителю страницы, добавлять новую информацию. Самым обычным примером может быть гостевая книга или система комментариев на сайте. Добавляемый таким образом текст может содержать множество различных тегов, добавленных случайно при копировании текста или намеренно, чтобы внести сообщение как-то «очень оригинально». Стоит отметить так же и злонамеренные попытки внести на сайт вредоносный код в тегах script или попытку испортить верстку страницы лишними тегами.
В любом из перечисленных случаев, возникает необходимость перед записью новой информации, очищать ее от лишних html-тегов.
Полная очистка текста от html-тегов
Часто для таких задач используются регулярные выражения, однако в этой статье рассмотрим самый простой метод – удаление тегов с помощью php-функции strip_tags. Эта функция просто удаляет теги из указанной в параметре строки.
В результате такой обработки в переменной $str_out получим строку без тегов:
Стоит обратить внимание, что функция strip_tags убирает только сами теги, оставляя их содержимое между открывающим и закрывающим тегом.
Удаление отдельных html-тегов из текста
Иногда нужно убрать только определенные теги из строки. Здесь мы так же воспользуемся функцией strip_tags, но в этот раз вторым (необязательным) параметром укажем теги, которые нужно сохранить.
Например, при обработке строки, нужно оставить только ссылки:
В результате такой обработки в переменной $str_out получим
Таким образом, можно указать все теги, которые допустимы в строке, тогда как все остальные будут удалены.
В данной статье рассмотрен самый простой способ очистки строки от тегов. Рассматривая другие варианты, я буду расширять эту статью. Буду рад, если Вы предложите свои варианты решения этой задачи в комментариях или по электронной почте.
Источник
Как убрать html теги из текста
Дата публикации: 2016-01-29
От автора: допустим, у вас есть кусок кода с каким-то содержимым, а вам нужно получить из него только текст. Вручную удалять все теги может быть очень долго и нудно, поэтому давайте разбираться, как с помощью php убрать html теги.
Если вам надо убрать из текста html-теги, то вам может пригодиться одна php-функция, которая хорошо справляется с этим заданием. Что она делает? Мы ей передаем нужную строку с кодом, а она вырезает оттуда все html и php-команды, возвращая содержимое без кода. Это функция strip_tags, которая имеет один обязательный и один необязательный параметры.
Соответственно, давайте сразу же протестируем ее работу.
Практический курс по верстке адаптивного сайта с нуля!
Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3
Это текст в абзаце
На экран выведется фраза “Это текст в абзаце”. Соответственно, вторым параметром можно задать те теги, которые не нужно удалять.
Это слова в пустом строчном спане
В этой случае мы запретили функции удалять тег span и на экран он выведется вместе с текстом. Я думаю, основная цель strip_tags вам понятна. Если в коде присутствуют комментарии, то они тоже будут удалены. Но что, если удалить теги надо из целого файла? Для этого есть другая команда, которую рассмотрим далее.
Как убрать html теги из текста с помощью fgetss()
Эта команда отличается от предыдущей тем, что позволяет убрать html теги из всего файла. Для этого его предварительно необходимо открыть с помощью fopen(), в которой указывается путь до файла и режим, котором будет работа с ним.
Сама функция fgetss содержит три параметра. Первым является указатель на файл, с которого надо убирать лишнее. Второй параметр – длина получаемых данных, можно увидеть в блокноте или любом текстовом редакторе. Записывается в виде числового значения. Третий и необязательный параметр – разрешенные теги, которые не будут удалены. Этот параметр записывается также, как и для функции strip_tags.
Практический курс по верстке адаптивного сайта с нуля!
Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3
Что мы в данном случае сделали:
Открыли файл “file.php”, сделав его доступным для чтения
Метод feof() проверяет, достигнут ли конец файла
По нашему условию, если конец файла достигнут, то с помощью функции fgetss() обрабатываем файл и выводим на экран всю информацию в новой переменной.
После этого файл закрывается. Пользоваться функцией есть смысл, когда необходимо удалить теги из файла, где их может быть сотни.
Убираем html-теги с помощью онлайн сервиса
Возможно, у вас нет желания пользоваться возможностями php для очищения текста от ненужных элементов. Что ж, есть способ гораздо более простой. Это онлайн сервис 0en.ru, который может удалять html дескрипторы и комментарии из скопированного в поле текста. С его помощью можно получить чистый текст уже через несколько секунд.
Единственный минус веб-сервиса в том, что он удаляет абсолютно все, поэтому если вы хотите какие-то из них оставить, то лучше все-таки воспользоваться одной из функций PHP.
Замена символов
Ну а что, если вам нужно удалить всего лишь 1-2 тега на странице. Сделать это еще проще. В любом нормальном текстовом редакторе есть функция “найти и заменить”. В первое поле вы вписываете символы, которые нужно найти (нужный нам открывающий тег), а во второе – на что его заменить. Здесь просто оставляем пустое место. Клац, и все удалилось. Соответственно, если тег парный, то нужно не забыть удалить и его закрывающую часть.
Сегодня мы с вами узнали несколько способов удаления html тегов из текста. Используйте если надо и читайте наш блог, чтобы узнавать еще больше о веб-технологиях.
Практический курс по верстке адаптивного сайта с нуля!
Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3
Источник
strip_tags
(PHP 4, PHP 5, PHP 7, PHP 8)
strip_tags — Удаляет теги HTML и PHP из строки
Описание
Функция пытается возвратить строку, из которой удалены все NULL-байты, HTML- и PHP-теги из заданной строки ( string ). Для удаления тегов используется тот же механизм, что и в функции fgetss() .
Список параметров
Второй необязательный параметр может быть использован для указания тегов, которые не нужно удалять. Они указываются как строка ( string ) или как массив ( array ) с PHP 7.4.0. Смотрите пример ниже относительно формата этого параметра.
Комментарии HTML и PHP-теги также будут удалены. Это жёстко задано в коде и не может быть изменено с помощью параметра allowed_tags .
Самозакрывающиеся (такие как
) теги XHTML игнорируются и только не самозакрывающиеся теги должны быть использованы в allowed_tags . К примеру, для разрешения как
, так и
нужно сделать следующее:
Возвращаемые значения
Возвращает строку без тегов.
Список изменений
Версия | Описание |
---|---|
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, то частичные или сломанные теги могут послужить удалением большего количества текста или данных, чем ожидалось.
Эта функция не изменяет атрибуты тегов, разрешённых с помощью allowed_tags , включая такие атрибуты как style и onmouseover , которые могут быть использованы озорными пользователями при отправке текста, отображаемого также и другим пользователям.
Имена тегов в HTML превышающие 1023 байта будут рассматриваться как невалидные независимо от параметра allowed_tags .
Смотрите также
- htmlspecialchars() — Преобразует специальные символы в HTML-сущности
User Contributed Notes 17 notes
Hi. I made a function that removes the HTML tags along with their contents:
Function:
function strip_tags_content ( $text , $tags = » , $invert = FALSE ) <
preg_match_all ( ‘/ /si’ , trim ( $tags ), $tags );
$tags = array_unique ( $tags [ 1 ]);
if( is_array ( $tags ) AND count ( $tags ) > 0 ) <
if( $invert == FALSE ) <
return preg_replace ( ‘@ . implode ( ‘|’ , $tags ) . ‘)\b)(\w+)\b.*?>.*? @si’ , » , $text );
>
else <
return preg_replace ( ‘@ . implode ( ‘|’ , $tags ) . ‘)\b.*?>.*? @si’ , » , $text );
>
>
elseif( $invert == FALSE ) <
return preg_replace ( ‘@ .*? @si’ , » , $text );
>
return $text ;
>
?>
Sample text:
$text = ‘sample text with
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.
Test script:
—————
= ‘ \’ ?>2′ ;
var_dump ( strip_tags ( $str ));
a HTML code like this:
material is wood
‘ ;
?>
with = strip_tags ( $html ); ?>
. the result is:
$str = ‘color is bluesize is huge
material is wood’;
notice: the words ‘blue’ and ‘size’ grow together 🙁
and line-breaks are still in new string $str
if you need a space between the words (and without line-break)
use my function: = rip_tags ( $html ); ?>
. the result is:
$str = ‘color is blue size is huge material is wood’;
function rip_tags ( $string ) <
// —— remove HTML TAGs ——
$string = preg_replace ( ‘/ ]*>/’ , ‘ ‘ , $string );
// —— remove control characters ——
$string = str_replace ( «\r» , » , $string ); // — replace with empty space
$string = str_replace ( «\n» , ‘ ‘ , $string ); // — replace with space
$string = str_replace ( «\t» , ‘ ‘ , $string ); // — replace with space
// —— remove multiple spaces ——
$string = trim ( preg_replace ( ‘/ <2,>/’ , ‘ ‘ , $string ));
// —————————————————————
?>
the KEY is the regex pattern: ‘/ ]*>/’
instead of strip_tags()
. then remove control characters and multiple spaces
🙂
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.
«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
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.
function stripUnwantedTagsAndAttrs ( $html_str ) <
$xml = new DOMDocument ();
//Suppress warnings: proper error handling is beyond scope of example
libxml_use_internal_errors ( true );
//List the tags you want to allow here, NOTE you MUST allow html and body otherwise entire string will be cleared
$allowed_tags = array( «html» , «body» , «b» , «br» , «em» , «hr» , «i» , «li» , «ol» , «p» , «s» , «span» , «table» , «tr» , «td» , «u» , «ul» );
//List the attributes you want to allow here
$allowed_attrs = array ( «class» , «id» , «style» );
if (! strlen ( $html_str ))
if ( $xml -> loadHTML ( $html_str , LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD )) <
foreach ( $xml -> getElementsByTagName ( «*» ) as $tag ) <
if (! in_array ( $tag -> tagName , $allowed_tags )) <
$tag -> parentNode -> removeChild ( $tag );
>else <
foreach ( $tag -> attributes as $attr ) <
if (! in_array ( $attr -> nodeName , $allowed_attrs )) <
$tag -> removeAttribute ( $attr -> nodeName );
>
>
>
>
>
return $xml -> saveHTML ();
>
?>
Note the different outputs from different versions of the same tag:
// striptags.php
$data = ‘
Each
New
Line’ ;
$new = strip_tags ( $data , ‘
‘ );
var_dump ( $new ); // OUTPUTS string(21) «
EachNew
Line»
php // striptags.php
$data = ‘
Each
New
Line’ ;
$new = strip_tags ( $data , ‘
‘ );
var_dump ( $new ); // OUTPUTS string(16) «Each
NewLine»
php // striptags.php
$data = ‘
Each
New
Line’ ;
$new = strip_tags ( $data , ‘
‘ );
var_dump ( $new ); // OUTPUTS string(11) «EachNewLine»
?>
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.
function better_strip_tags ( $str , $allowable_tags = » , $strip_attrs = false , $preserve_comments = false , callable $callback = null ) <
$allowable_tags = array_map ( ‘strtolower’ , array_filter ( // lowercase
preg_split ( ‘/(?:>|^)\\s*(?: , $allowable_tags , — 1 , PREG_SPLIT_NO_EMPTY ), // get tag names
function( $tag ) < return preg_match ( '/^[a-z][a-z0-9_]*$/i' , $tag ); >// filter broken
) );
$comments_and_stuff = preg_split ( ‘/( |$))/’ , $str , — 1 , PREG_SPLIT_DELIM_CAPTURE );
foreach ( $comments_and_stuff as $i => $comment_or_stuff ) <
if ( $i % 2 ) < // html comment
if ( !( $preserve_comments && preg_match ( ‘/ /’ , $comment_or_stuff ) ) ) <
$comments_and_stuff [ $i ] = » ;
>
> else < // stuff between comments
$tags_and_text = preg_split ( «/( \»‘]++|\»[^\»]*+(?:\»|$)|'[^’]*+(?:’|$))*(?:>|$))/» , $comment_or_stuff , — 1 , PREG_SPLIT_DELIM_CAPTURE );
foreach ( $tags_and_text as $j => $tag_or_text ) <
$is_broken = false ;
$is_allowable = true ;
$result = $tag_or_text ;
if ( $j % 2 ) < // tag
if ( preg_match ( «%^( \»‘/]++|/+?|\»[^\»]*\»|'[^’]*’)*?(/?>)%i» , $tag_or_text , $matches ) ) <
$tag = strtolower ( $matches [ 2 ] );
if ( in_array ( $tag , $allowable_tags ) ) <
if ( $strip_attrs ) <
$opening = $matches [ 1 ];
$closing = ( $opening === ‘ ) ? ‘>’ : $closing ;
$result = $opening . $tag . $closing ;
>
> else <
$is_allowable = false ;
$result = » ;
>
> else <
$is_broken = true ;
$result = » ;
>
> else < // text
$tag = false ;
>
if ( ! $is_broken && isset( $callback ) ) <
// allow result modification
call_user_func_array ( $callback , array( & $result , $tag_or_text , $tag , $is_allowable ) );
>
$tags_and_text [ $j ] = $result ;
>
$comments_and_stuff [ $i ] = implode ( » , $tags_and_text );
>
>
$str = implode ( » , $comments_and_stuff );
return $str ;
>
?>
Callback arguments:
* &$result: contains text to be placed insted of original piece (e.g. empty string for forbidden tags), it can be changed;
* $tag_or_text: original piece of text or a tag (see below);
* $tag: false for text between tags, lowercase tag name for tags;
* $is_allowable: boolean telling if a tag isn’t allowed (to avoid double checking), always true for text between tags
Callback function isn’t called for comments and broken tags.
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.
Источник