获取PHP中HTML的摘录
我需要得到一个简短的摘录新闻项目写在HTML上显示在我的头版。显然,我不能使用像获取PHP中HTML的摘录,php,html,Php,Html,我需要得到一个简短的摘录新闻项目写在HTML上显示在我的头版。显然,我不能使用像substr这样简单的东西,因为它可能会使标记未关闭,甚至留下半个标记 哪一个更容易: 将HTML转换为外观良好的纯文本,并从中获取一部分 从HTML开始,在截止处关闭所有未关闭的标记(这看起来总是可以吗?) 我该如何实现所选的解决方案呢?最简单的方法是在截断之前使用strip_tags()从项目文本中剥离所有HTML。如果保留原始新闻项目的HTML结构很重要,我会选择第二个选项 实现这一点的一个简单方法是运行片
substr
这样简单的东西,因为它可能会使标记未关闭,甚至留下半个标记
哪一个更容易:
- 将HTML转换为外观良好的纯文本,并从中获取一部分
- 从HTML开始,在截止处关闭所有未关闭的标记(这看起来总是可以吗?)
我该如何实现所选的解决方案呢?最简单的方法是在截断之前使用
strip_tags()
从项目文本中剥离所有HTML。如果保留原始新闻项目的HTML结构很重要,我会选择第二个选项
实现这一点的一个简单方法是运行片段以关闭任何未关闭的标记。具体请参见方法。您可以尝试将数据解析为XML,然后仅截断“纯”文本节点
注意:此解决方案强制输入为有效的XML,并且始终处于大致相同的结构中。您好,我想您正在寻找的是所谓的网站抓取。 这里是你如何刮一个网站; 使用库PHP简单HTML DOM解析器下载 最后,这里是如何刮除Slashdot的代码
// Create DOM from URL
$html = file_get_html('http://slashdot.org/');
// Find all article blocks
foreach($html->find('div.article') as $article) {
$item['title'] = $article->find('div.title', 0)->plaintext;
$item['intro'] = $article->find('div.intro', 0)->plaintext;
$item['details'] = $article->find('div.details', 0)->plaintext;
$articles[] = $item;
}
print_r($articles);
这篇文章摘录到第一段,没有删减文字,并附加了可选的线索 $EXECRPT=self::节选_段落($html,180)
/**
*摘自html内容的第一段
*
**/
公共静态函数摘录_段($html,$max_char=100,$trail='…'))
{
//用于捕获p标记的临时变量
$matches=array();
if(preg_match('/[^>]+/',$html,$matches))
{
//发现
$p=带标签($matches[0]);
}否则{
$p=带标签($html);
}
//缩短而不删减单词
$p=self::short\u str($p$max\u char);
//删除尾随逗号、句号、冒号、分号、“a”、“a”和空格
$p=rtrim($p,,.;:aA');
//如果只是空格或太短,则不返回任何内容
如果(ctype_space($p)| |$p==''| | strlen($p)有时最好使用带有组和惰性量词的正则表达式来表示前两段
function excerpt_from_html($str) {
$re = '/(<p>\X*?<\/p>)\X*?(<p>\X*?<\/p>)/u';
preg_match($re, $str, $matches);
return $matches[1] . $matches[2];
}
函数摘录自html($str){
$re='/(\X*?)\X*?(\X*?)/u';
预匹配($re,$str,$matches);
返回$matches[1]。$matches[2];
}
或者你可以选择3-4段,根据摘录的长度决定要显示多少段。现在就用它来自动生成摘录。这不是最好的,但没关系,因为我提供了带有特殊标记的新闻海报来指定他们自己的摘录。在这种情况下不使用它,但仍然很有帮助。这例如,第三种方法是解析HTML。
function excerpt_from_html($str) {
$re = '/(<p>\X*?<\/p>)\X*?(<p>\X*?<\/p>)/u';
preg_match($re, $str, $matches);
return $matches[1] . $matches[2];
}