Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取PHP中HTML的摘录_Php_Html - Fatal编程技术网

获取PHP中HTML的摘录

获取PHP中HTML的摘录,php,html,Php,Html,我需要得到一个简短的摘录新闻项目写在HTML上显示在我的头版。显然,我不能使用像substr这样简单的东西,因为它可能会使标记未关闭,甚至留下半个标记 哪一个更容易: 将HTML转换为外观良好的纯文本,并从中获取一部分 从HTML开始,在截止处关闭所有未关闭的标记(这看起来总是可以吗?) 我该如何实现所选的解决方案呢?最简单的方法是在截断之前使用strip_tags()从项目文本中剥离所有HTML。如果保留原始新闻项目的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];
}