我正在制作一些博客布局,我需要在主页上创建每个帖子的摘要(比如说最新的15个)。现在我使用的内容已经由纺织库以html标签格式化。现在,如果我使用substr来获得帖子的前500个字符,我面临的主要问题是如何关闭未关闭的标签。
e.g
<div>.......................</div>
<div>...........
<p>............</p>
<p>...........| 500 chars
</p>
<div>
我得到的是两个未封闭的标签&lt; p&gt;和&lt; div&gt; ,p不会造成太多麻烦,但div只是整个页面布局混乱。那么任何建议如何跟踪开口标签并手动关闭它们或什么?
答案 0 :(得分:16)
有很多方法可以使用:
答案 1 :(得分:12)
正如ajreal所说,DOMDocument是一个解决方案。
示例:
$str = "
<html>
<head>
<title>test</title>
</head>
<body>
<p>error</i>
</body>
</html>
";
$doc = new DOMDocument();
@$doc->loadHTML($str);
echo $doc->saveHTML();
优点:本身包含在PHP中,与PHP Tidy相反。
答案 2 :(得分:0)
您可以使用DOMDocument来执行此操作,但请注意字符串编码问题。此外,您必须使用完整的HTML文档,然后提取所需的组件。这是一个例子:
function make_excerpt ($rawHtml, $length = 500) {
// append an ellipsis and "More" link
$content = substr($rawHtml, 0, $length)
. '… <a href="/link-to-somewhere">More ></a>';
// Detect the string encoding
$encoding = mb_detect_encoding($content);
// pass it to the DOMDocument constructor
$doc = new DOMDocument('', $encoding);
// Must include the content-type/charset meta tag with $encoding
// Bad HTML will trigger warnings, suppress those
@$doc->loadHTML('<html><head>'
. '<meta http-equiv="content-type" content="text/html; charset='
. $encoding . '"></head><body>' . trim($content) . '</body></html>');
// extract the components we want
$nodes = $doc->getElementsByTagName('body')->item(0)->childNodes;
$html = '';
$len = $nodes->length;
for ($i = 0; $i < $len; $i++) {
$html .= $doc->saveHTML($nodes->item($i));
}
return $html;
}
$html = "<p>.......................</p>
<p>...........
<p>............</p>
<p>...........| 500 chars";
// output fixed html
echo make_excerpt($html, 500);
输出:
<p>.......................</p>
<p>...........
</p>
<p>............</p>
<p>...........| 500 chars… <a href="/link-to-somewhere">More ></a></p>
如果您使用的是WordPress,则应将substr()
调用包含在wpautop
- wpautop(substr(...))
的调用中。您可能还希望测试传递给函数的$ rawHtml的长度,并跳过附加&#34;更多&#34;链接,如果它不够长。