Удалить содержимое тегов php

Удаление из строки HTML тегов в PHP

Задача удалять все или только определенные html-теги из строки часто возникает там, где необходимо предоставить возможность любому посетителю страницы, добавлять новую информацию. Самым обычным примером может быть гостевая книга или система комментариев на сайте. Добавляемый таким образом текст может содержать множество различных тегов, добавленных случайно при копировании текста или намеренно, чтобы внести сообщение как-то «очень оригинально». Стоит отметить так же и злонамеренные попытки внести на сайт вредоносный код в тегах script или попытку испортить верстку страницы лишними тегами.

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

Полная очистка текста от html-тегов

Часто для таких задач используются регулярные выражения, однако в этой статье рассмотрим самый простой метод – удаление тегов с помощью php-функции strip_tags. Эта функция просто удаляет теги из указанной в параметре строки.

$str_in = "

Мой текст с различными тегами.

"
;
$str_out = strip_tags($str_in);
echo $str_out;

В результате такой обработки в переменной $str_out получим строку без тегов:

Мой текст с различными тегами.

Стоит обратить внимание, что функция strip_tags убирает только сами теги, оставляя их содержимое между открывающим и закрывающим тегом.

Удаление отдельных html-тегов из текста

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

Например, при обработке строки, нужно оставить только ссылки:

$str_in = "

Мой текст с различными тегами.

"
;
$str_out = strip_tags($str_in, '');
echo $str_out;

В результате такой обработки в переменной $str_out получим

Таким образом, можно указать все теги, которые допустимы в строке, тогда как все остальные будут удалены.

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

Источник

strip_tags

This function tries to return a string with all NULL bytes, HTML and PHP tags stripped from a given string . It uses the same tag stripping state machine as the fgetss() function.

Parameters

You can use the optional second parameter to specify tags which should not be stripped. These are either given as string , or as of PHP 7.4.0, as array . Refer to the example below regarding the format of this parameter.

Note:

HTML comments and PHP tags are also stripped. This is hardcoded and can not be changed with allowed_tags .

Note:

Self-closing XHTML tags are ignored and only non-self-closing tags should be used in allowed_tags . For example, to allow both
and
, you should use:

Return Values

Returns the stripped string.

Changelog

Version Description
8.0.0 allowed_tags is nullable now.
7.4.0 The allowed_tags now alternatively accepts an array .

Examples

Example #1 strip_tags() example

// as of PHP 7.4.0 the line above can be written as:
// echo strip_tags($text, [‘p’, ‘a’]);
?>

The above example will output:

Notes

This function should not be used to try to prevent XSS attacks. Use more appropriate functions like htmlspecialchars() or other means depending on the context of the output.

Because strip_tags() does not actually validate the HTML, partial or broken tags can result in the removal of more text/data than expected.

This function does not modify any attributes on the tags that you allow using allowed_tags , including the style and onmouseover attributes that a mischievous user may abuse when posting text that will be shown to other users.

Note:

Tag names within the input HTML that are greater than 1023 bytes in length will be treated as though they are invalid, regardless of the allowed_tags parameter.

See Also

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 ( ‘/<(.+?)[\s]*\/?[\s]*>/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 ( ‘@<(\w+)\b.*?>.*?@si’ , » , $text );
>
return $text ;
>
?>

Sample text:
$text = ‘sample text with

tags

‘;

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

tags

I hope that someone is useful 🙂

$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:
. 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 ( ‘/ /’ , ‘ ‘ , $string ));

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

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

‘,’
‘) => ‘Hello World

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

Note, strip_tags will remove anything looking like a tag — not just tags — i.e. if you have tags in attributes then they may be removed too,

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.

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 ();
>
?>

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.

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

$data = ‘
Each
New
Line’ ;
$new = strip_tags ( $data , ‘
‘ );
var_dump ( $new ); // OUTPUTS string(21) «
EachNew
Line»

$data = ‘
Each
New
Line’ ;
$new = strip_tags ( $data , ‘
‘ );
var_dump ( $new ); // OUTPUTS string(16) «Each
NewLine»

$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.

Источник

Читайте также:  Регулярное выражение php до первого вхождения
Оцените статью