从php字符串中删除所有html标记


80

我想显示数据库条目的前110个字符。到目前为止很简单:

<?php echo substr($row_get_Business['business_description'],0,110) . "..."; ?>

但是上面的条目中包含由客户端输入的html代码。因此显示:

<p class="Body1"><strong><span style="text-decoration: underline;">Ref no:</span></strong> 30001<strong></stro...

显然没有好处。

我只想剥离所有html代码,所以我需要从数据库条目中删除<和>之间的所有内容,然后显示前100个字符。

有任何想法吗?


样本输入和输出.........
Venkata克里希纳

Answers:


138

使用 strip_tags

$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);   //output Test paragraph. Other text

<?php echo substr(strip_tags($row_get_Business['business_description']),0,110) . "..."; ?>

为什么不起作用?:(我使用的是:数据=ヶ辆($内容描述2,ENT_QUOTES, 'UTF-8');,用strip_tags($的数据),而不是作品

我用uft8_encode解决了问题:),似乎strip_tags无法覆盖htmlentities

这样也可以保护页面免受xss脚本攻击吗?
thekucays

1
@delive为什么在世界上会htmlentities然后奔跑strip_tags?这完全违背了目的。
Captain Hypertext

它可能不会阻止某些JavaScript。不要期望此功能会产生奇迹。
PJ Brunet

18

使用PHP的strip_tags()函数

例如:

$businessDesc = strip_tags($row_get_Business['business_description']);
$businessDesc = substr($businessDesc, 0, 110);


print($businessDesc);

2
这将首先使用100个字符,然后删除html标签。但是我认为OP希望先删除html标签,然后再删除100个字符。
Yogesh Suthar

1
@YogeshSuthar非常正确,我现在将编辑答案,谢谢您指出。-完成
EM-Creations

11

从包含内容的PHP字符串中删除所有HTML标记!

假设您的字符串包含锚标签,并且您想删除包含内容的标签,那么此方法将很有帮助。

$srting = '<a title="" href="https://stackoverflow.com/index.html"><b>Some Text</b></a>
Lorem Ipsum is simply dummy text of the printing and typesetting industry.';

echo strip_tags_content($srting);

function strip_tags_content($text) {

    return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text);
    
 }

输出:

Lorem Ipsum只是印刷和排版行业的伪文本。


1
几乎。WhatWG的第12.1.2.2.4节说的</script >是有效的结束标记,但不由正则表达式处理。应该是</\1\s*>这样的。
主教

6

使用此正则表达式: /<[^<]+?>/g

$val = preg_replace('/<[^<]+?>/g', ' ', $row_get_Business['business_description']);

$businessDesc = substr(val,0,110);

从你的例子应该保持: Ref no: 30001


5
strip_tags在那,为什么要使用正则表达式?

1
不确定,但我认为它不会捕获包含空格的自闭标签:<br /><special />。我也认为这并未考虑<b<b>></</b>>到骇客之类的问题。
kaiser 2014年

我认为kaiser指的是这个答案,不是strip_tags
pjmil

这是比PHP strip_tag更好的解决方案。PHP strip_tag将同时删除打开和关闭HTML脚本元素。但是,如果您的用户仅放置打开的HTML脚本元素,则PHP strip_tag不会将其删除。那么您的网页很可能会显示完全错误。使用PHP 5.6.19版进行了测试。这个小小的正则表达式修复了那些可能导致strip_tag遗漏的问题的部分HTML标记。太棒了!
2016年

问题在于,有时用户会编写无效的html,例如,客户端的<div名称<div> hello> </ div>,并使用strip_tag会删除所有内容……还有一些我们想要更保留的方式,因此,我将使用正则表达式...“因为strip_tags()实际上并未验证HTML,因此部分或损坏的标记可能会导致删除比预期更多的文本/数据。”
Miguel

2

对我来说这是最好的解决方案。

function strip_tags_content($string) { 
    // ----- remove HTML TAGs ----- 
    $string = preg_replace ('/<[^>]*>/', ' ', $string); 
    // ----- remove control characters ----- 
    $string = str_replace("\r", '', $string);
    $string = str_replace("\n", ' ', $string);
    $string = str_replace("\t", ' ', $string);
    // ----- remove multiple spaces ----- 
    $string = trim(preg_replace('/ {2,}/', ' ', $string));
    return $string; 

}

0

在laravel中,您可以使用以下语法

 @php
   $description='<p>Rolling coverage</p><ul><li><a href="http://xys.com">Brexit deal: May admits she would have </a><br></li></ul></p>'
 @endphp
 {{  strip_tags($description)}}

0

<?php $data = "<div><p>Welcome to my PHP class, we are glad you are here</p></div>"; echo strip_tags($data); ?>

或者,如果您有来自数据库的内容;

<?php $data = strip_tags($get_row['description']); ?> <?=substr($data, 0, 100) ?><?php if(strlen($data) > 100) { ?>...<?php } ?>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.