我遇到的问题是,我从数据库中提取了最多400个字符串的字符串,但是,此字符串需要包含HTML实体。
客户端创建了一个字符串,让第400个字符位于关闭的P标记中间,从而导致标记被删除,导致其后的代码出现其他错误。
我希望完全删除这个关闭的P标签,因为我有一个附加到末尾的“...阅读更多”链接,如果附加到现有段落,它看起来会更清晰。
最好的方法是什么来涵盖所有HTML实体问题?是否有PHP函数会自动关闭/删除任何错误的HTML标记?我不需要编码的答案,只是方向会有很大的帮助。
感谢。
答案 0 :(得分:3)
这是一个使用DOMDocument可以实现的简单方法,它并不完美,但可能会引起人们的兴趣:
<?php
function html_tidy($src){
libxml_use_internal_errors(true);
$x = new DOMDocument;
$x->loadHTML('<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />'.$src);
$x->formatOutput = true;
$ret = preg_replace('~<(?:!DOCTYPE|/?(?:html|body|head))[^>]*>\s*~i', '', $x->saveHTML());
return trim(str_replace('<meta http-equiv="Content-Type" content="text/html;charset=utf-8">','',$ret));
}
$brokenHTML[] = "<p><span>This is some broken html</spa";
$brokenHTML[] = "<poken html</spa";
$brokenHTML[] = "<p><span>This is some broken html</spa</p>";
/*
<p><span>This is some broken html</span></p>
<poken html></poken>
<p><span>This is some broken html</span></p>
*/
foreach($brokenHTML as $test){
echo html_tidy($test);
}
?>
虽然注意到Mike 'Pomax' Kamermans
的评论。
答案 1 :(得分:0)
为什么你不删除段落或内容中的最后一个单词并将其删除,如果单词完整则删除它,如果不完整你也删除它,你确定内容仍然干净,我向您展示一下代码的示例:
while($row = $req->fetch(PDO::FETCH_OBJ){
//extract 400 first characters from the content you need to show
$extraction = substr($row->text, 0, 400);
// find the last space in this extraction
$last_space = strrpos($extraction, ' ');
//take content from the first character to the last space and add (...)
echo substr($extraction, 0, $last_space) . ' ...';
}
答案 2 :(得分:0)
删除最后一个损坏的标签,然后删除strip_tags
$str = "<p>this is how we do</p";
$str = substr($str, 0, strrpos($str, "<"));
$str = strip_tags($str);