【发布时间】:2011-01-16 14:57:37
【问题描述】:
我正在尝试使用 PHP 脚本将一些网页保存到文本文件中。
如何使用 PHP 将网页加载到文件缓冲区并删除 HTML 标签?
【问题讨论】:
我正在尝试使用 PHP 脚本将一些网页保存到文本文件中。
如何使用 PHP 将网页加载到文件缓冲区并删除 HTML 标签?
【问题讨论】:
fopen() 或 file_get_contents() 网址:fopen("http://google.com/", "r")
http_get() 来自 PHP 的 http 模块fsockopen() 或 stream_socket_client() 发送它
system()调用wget或curl等外部工具
但这些都不能保证在您的服务器上可用。
【讨论】:
一种方式:
$url = "http://www.brothersoft.com/publisher/xtracomponents.html";
$page = file_get_contents($url);
$outfile = "xtracomponents.html";
file_put_contents($outfile, $page);
上面的代码只是一个例子,没有任何(!)错误检查和处理。
【讨论】:
正如其他答案所说,标准的 PHP 流函数或 cURL 是 检索 HTML 的最佳选择。至于删除标签,这里有几种方法:
选项 #1:使用 Tidy 扩展(如果在您的服务器上可用)以递归方式遍历文档树并从节点返回文本。像这样的:
function textFromHtml(TidyNode $node) {
if ($node->isText()) {
return $node->value;
} else if ($node->hasChildren()) {
$childText = '';
foreach ($node->child as $child)
$childText .= textFromHtml($child);
return $childText;
}
return '';
}
您可能想要比这更复杂的东西,例如,用换行符替换 <br /> 标记(其中 $node->name == 'br'),但这只是开始。
然后,将 HTML 文本加载到 Tidy 对象中,并在 body 节点上调用您的函数。如果您有字符串中的内容,请使用:
$tidy = new tidy();
$tidy->parseString($contents);
$text = textFromHtml($tidy->body());
选项#2:使用正则表达式去除< 和> 之间的所有内容。您可以(并且可能应该)开发更复杂的正则表达式,例如,仅匹配有效的 HTML 开始或结束标记。如果您不小心,页面语法中的任何错误(例如正文中的尖括号)都可能意味着垃圾输出。这就是 Tidy 如此出色的原因(它专门用于清理不良页面),但它可能不可用。
【讨论】:
我强烈建议你看看 SimpleHTML DOM 类;
SimpleHTML DOM Parser at SourceForge
有了它,您可以使用 css 选择器搜索 DOM 树,例如使用 jQuery 的 $() 函数或prototypeJS $$() 函数。
虽然它可以与 file_get_contents() 一起使用来获取网页的内容,但您只能使用您的一些 cURL 类(如果您需要登录等)传递 HTML
【讨论】: