如何使用 PHP 的 DOM 扩展 loadHTML

How to use PHP's DOM extension loadHTML

提问人:Jeff 提问时间:11/14/2009 更新时间:11/14/2009 访问量:4552

问:

有人建议我,为了关闭一些“悬空”的 HTML 标签,我应该使用 PHP 的 DOM 扩展和 loadHTML。

我已经尝试了一段时间,搜索教程,阅读此页面,尝试各种事情,但似乎无法弄清楚如何使用它来实现我想要的东西。

我有这个字符串:<div><p>The quick brown <a href="">fox jumps...

我需要编写一个函数来关闭打开的HTML标签。

只是在这里寻找一个起点。我通常可以很快弄清楚事情。

PHP的

评论


答:

2赞 Mike Crowe 11/14/2009 #1

好吧,http://htmlpurifier.org/ 呢? 还 http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/index.php

你能用Tidy吗?http://php.net/manual/en/book.tidy.php

2赞 tplaner 11/14/2009 #2

虽然我相信你可以让 DOM 做你想做的事,但我很确定你使用 Tidy 会更好。

评论

0赞 Jeff 11/14/2009
希望我可以,不能在我的服务器上安装 Tidy。
1赞 tplaner 11/14/2009
虽然不那么全面,但有一些功能会检查并关闭任何打开的标签,两个例子是 snipplr.com/view/3618/close-tags-in-a-htmlsnippetcodesnippets.joyent.com/posts/show/959
1赞 tplaner 11/14/2009
我相当确定 www.phpclasses.org 上有一些类也会关闭打开的标签,您也可以查看为 XML 构建的类,因为它们基本上以相同的方式工作。
0赞 Franz 11/14/2009 #3

我认为你遵循了错误的方法:你必须使用 DOM 的东西来截断字符串,而不是在截断它之后。

我是这样做的:

  1. 找到要截断字符串的位置
  2. 删除该点之后的所有子节点
  3. 截断字符串
3赞 Mark Tomlin 11/14/2009 #4

可以在 PHP 中使用 DOMDocument::loadHTML() 和 DOMDocument::normalizeDocument() 方法使用 DOMDocument 类来完成。

<?php
    $html = '<div><p>The quick brown <a href="">fox jumps';

    $DDoc = new DOMDocument();
    $DDoc->loadHTML($html);
    $DDoc->normalizeDocument();

    echo $DDoc->saveHTML();
?>

输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body><div><p>The quick brown <a href="">fox jumps</a></p></div></body></html> 

从那里开始,只需 substr & strpos 掉你不想要的 html,就像这样:

<?php
    $html = '<div><p>The quick brown <a href="">fox jumps';

    $DDoc = new DOMDocument();
    $DDoc->loadHTML($html);
    $DDoc->normalizeDocument();

    $html = $DDoc->saveHTML();

    # Remove Everything Before & Including The Opening HTML & Body Tags.
    $html = substr($html, strpos($html, '<html><body>') + 12);
    # Remove Everything After & Including The Closing HTML & Body Tags.
    $html = substr($html, 0, -14);

    echo $html;
?>

评论

0赞 Jeff 11/14/2009
整洁对我来说不是一个选择,但希望有人会发现这些信息有用。一会儿要尝试 DOM 部分。谢谢!
0赞 Jeff 11/14/2009
我们如何为 XHTML 做到这一点?
0赞 Mark Tomlin 11/15/2009
我认为您需要做的就是将 DocType 更改为任何 xhtml dtd。运气好的话。