去除HTML标签

4

目前,我使用strip_tags从处理的字符串中删除所有html标签。但是,我最近注意到它会将包含在已删除标签中的单词连接起来。

$str = "<li>Hello</li><li>world</li>";
$result = strip_tags($str);
echo $result;
(prints HelloWorld)

你该如何解决这个问题?

3
你的字符串中没有任何空格,为什么PHP要插入它们(在哪里插入)?把它看作一个简单的替换函数。 - Felix Kling
2
嗨,Felix。我明白你的观点。问题在于这是非常普遍的事情。比如说,你需要从文档中提取标签,将干净的文本插入数据库以进行全文搜索。你如何确保内容是干净且格式正确的呢? - Thomas
这就像鸡和蛋的问题,你想要去除HTML标签,但同时又想保留原始文本的格式,很难在两者之间取得平衡。如果你想满足全文搜索的需求,有很多方法... - ajreal
发现了下面这个问题,基本上解决了我的问题 https://dev59.com/s2855IYBdhLWcg3wMRRV 无论如何都感谢你的帮助。 - Thomas
可能是在PHP中使用strip_tags的问题的重复。 - j08691
6个回答

2
这将替换所有的HTML标签(实际上是任何形式为< ABC >的标签,而无需检查它是否真正是HTML),用空格替换,然后将可能存在的双空格替换为单空格,并删除开头或结尾的空格。
$str = preg_replace("/<.*?>/", " ", $str);
$str = trim(str_replace("  ", " ", $str));

2
你可以尝试不同的正则表达式模式和替换方法来玩耍 :)
// ------------------------------------ 

function strip_html_tags($string) { 

    $string = str_replace("\r", ' ', $string); 
    $string = str_replace("\n", ' ', $string); 
    $string = str_replace("\t", ' ', $string); 
##  $string = str_replace("<li>', "\n* ", $string); 

##  $pattern = "/<.*?>/"; 
    $pattern = '/<[^>]*>/'; 

    $string= preg_replace ($pattern, ' ', $string); 

    $string= trim(preg_replace('/ {2,}/', ' ', $string));

return $string; 

}

// ------------------------------------ 

您可以添加特殊的替换,如:'<li>'"\n* " ... 或其他任何内容 :)

1
从您的代码中,我发现单词Hello World之间没有初始空格,并且您不希望strip_tags函数为您添加它,因此为了使strip_tags函数产生正常结果,我在第一个列表标记后添加了一个空格,结果是Hello world。
您可以复制并粘贴此代码以运行并查看区别。
    $str = "<li>Hello</li> <li>world</li>";
    $result = strip_tags($str);
    echo $result;
    //Expected result after Execution  is Hello world

因为我收到了一条消息说我可以这样做,那么这会造成任何伤害吗?还是我做错了什么? - Okwo moses
没有关系,但是你现在无法在这个答案上获得声望点数。 - Shadow The Spring Wizard

1
echo strip_tags( str_replace( '>', '> ', $string ));

那应该能够在所有情况下完全满足您的需求。

1

使用 htmlentities()会更好。

它不会删除 <>,而是将它们进行转义。


为什么您希望用户输入标签,然后将其删除? - Fabián Heredia Montiel

1

这完全取决于您在剥离HTML标签后想要的输出。例如:

如果您希望将<li>标签转换为普通项目列表,我建议您使用str_replace<li>替换为*,将</li>替换为\n

strip_tags的建议是仅删除HTML标签而不进行任何其他转换。


基本上,我想要一个没有混淆原始文本(连接单词等)的所有HTML标签被删除的字符串。 - Thomas

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