如果不完整,请删除HTML实体

时间:2013-06-19 01:45:56

标签: php html

我遇到的问题是,我从数据库中提取了最多400个字符串的字符串,但是,此字符串需要包含HTML实体。

客户端创建了一个字符串,让第400个字符位于关闭的P标记中间,从而导致标记被删除,导致其后的代码出现其他错误。

我希望完全删除这个关闭的P标签,因为我有一个附加到末尾的“...阅读更多”链接,如果附加到现有段落,它看起来会更清晰。

最好的方法是什么来涵盖所有HTML实体问题?是否有PHP函数会自动关闭/删除任何错误的HTML标记?我不需要编码的答案,只是方向会有很大的帮助。

感谢。

3 个答案:

答案 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);