从PHP字符串中删除所有HTML标签。

101

我希望显示数据库条目的前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 Krishna
9个回答

169
使用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) . "..."; ?>

1
为什么不起作用?:( 我正在使用:data = htmlentities($description2,ENT_QUOTES, 'UTF-8');,strip_tags($data),但不起作用。 - user3402040
这样做能够保护页面免受XSS脚本攻击吗? - thekucays
2
@delive 为什么你要运行 htmlentities 然后再运行 strip_tags?这完全违背了初衷。 - Captain Hypertext
此函数可能无法阻止某些类型的JavaScript。不要期望这个函数会有奇迹。 - PJ Brunet

23

使用 PHP 的 strip_tags() 函数

例如:

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


print($businessDesc);

3
首先会提取前100个字符,然后移除HTML标签。但我认为OP想要先移除HTML标签,再截取前100个字符。 - Yogesh Suthar
1
@YogeshSuthar 非常正确,我现在会编辑答案,感谢你指出。- 完成 - EM-Creations

16

使用PHP从字符串中删除所有HTML标签及其内容

假设您有包含锚点标记的字符串,您希望删除此标记及其内容,则此方法将很有帮助。

$srting = '<a title="" href="/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*>或类似的形式。 - bishop

7
使用这个正则表达式:/<[^<]+?>/g
$val = preg_replace('/<[^<]+?>/g', ' ', $row_get_Business['business_description']);

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

从你的例子中,应该保留:参考编号:30001


6
strip_tags 已经存在,为什么要使用正则表达式? - user1646111
2
不是很确定,但我认为它无法捕捉包含空格的自关闭标签:<br/>或<special/>。我还认为它没有考虑像<b<b>></b>>这样的黑客攻击。 - kaiser
我认为kaiser指的是这个答案,而不是strip_tags - pjmil
这是比PHP strip_tag更好的解决方案。PHP strip_tag将删除开放和关闭HTML Script元素。然而,如果您的用户只放置了开放HTML Script元素,则PHP strip_tag将无法删除它。那么您的网页很可能会显示完全错误。在PHP版本5.6.19中进行了测试。这个小正则表达式修复了那些可以导致strip_tag错过的部分HTML标记。太棒了! - ptay
问题在于有时用户会编写无效的HTML,例如:<div客户名称<div>hello></div>,使用strip_tag将删除一切...而有时我们希望采用更保留的方式,因此我会选择正则表达式... "因为strip_tags()实际上并没有验证HTML,部分或损坏的标记可能导致删除比预期更多的文本/数据。" - Miguel

2

将字符串中的HTML标签去除:

<?php
echo strip_tags("Hello <b>world!</b>");
?>

去除字符串中的HTML标签,但允许使用<br>标签:

<?php
         echo strip_tags("Hello <b><i>world!</i></b>","<i>");
?>

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

<?php $data = "<div><p>欢迎来到我的PHP课程,我们很高兴你在这里</p></div>"; echo strip_tags($data); ?>

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

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


0
$string = <p>Awesome</p><b> Website</b><i> by Narayan</i>. Thanks for visiting enter code here;
$tags = array("p", "i");

echo preg_replace('#<(' . implode( '|', $tags) . ')(?:[^>]+)?>.*?</\1>#s', '', $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)}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接