2013-06-19 35 views
1

我遇到了一个问题,其中显示了多达400个字符的数据库字符串,但是,该字符串必须包含HTML实体。删除HTML实体(如果未完成)

一次偶然的机会,客户创造了字符串有400个字符在关闭p标签的中间偏右坐,从而杀死标签,导致其他错误的之后的代码。

我宁愿今天的闭幕p标签被完全删除,因为我有一个“...更多”附加到年底,如果连接到现有的段落这看起来更清洁的链接。

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

谢谢。

+2

这听起来很傻,但最好的办法是做输入验证和拒绝超过400个字符的输入,所以这首先不会发生。如果客户可以输入您的代码无法处理的内容,请防止发生这种情况。 –

+0

你需要字符串中的任何HTML吗?如果没有,也许你可以strip_tags http://php.net/manual/en/function.strip-tags.php编辑:你可以结合使用这个找到/如果得到一个替代结果不会strip_tags除非[条件]。 – redditor

+0

只是删除损坏的结束标记不会有多大帮助:您仍然会打开标记。如果包含标签的标签可能也会丢失?考虑是试图重建缺失的标签,还是完全去除畸形的标签。这不是一个简单的问题,也不是 - 我没有答案。 – 2013-06-19 01:53:42

回答

3

这里有一个简单的方法,你可以用DOM文档做到这一点,它不是完美的,但它可能会感兴趣:

<?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的评论。

+0

哇!这真的有用!这让我整晚都不用拉我的头发。谢谢! :) – Imtiaz

+0

@Imtiaz np,很高兴它有帮助 –

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) . ' ...'; 
} 
0

只是删除最后一个破标记,然后用strip_tags

$str = "<p>this is how we do</p"; 
$str = substr($str, 0, strrpos($str, "<")); 
$str = strip_tags($str);