这里我正在为url创建预览。显示
这是我的尝试。
<?php
function plaintext($html)
{
$plaintext = preg_replace('#([<]title)(.*)([<]/title[>])#', ' ', $html);
// remove title
//$plaintext = preg_match('#<title>(.*?)</title>#', $html);
// remove comments and any content found in the the comment area (strip_tags only removes the actual tags).
$plaintext = preg_replace('#<!--.*?-->#s', '', $plaintext);
// put a space between list items (strip_tags just removes the tags).
$plaintext = preg_replace('#</li>#', ' </li>', $plaintext);
// remove all script and style tags
$plaintext = preg_replace('#<(script|style)\b[^>]*>(.*?)</(script|style)>#is', "", $plaintext);
// remove br tags (missed by strip_tags)
$plaintext = preg_replace("#<br[^>]*?>#", " ", $plaintext);
// remove all remaining html
$plaintext = strip_tags($plaintext);
return $plaintext;
}
function get_title($html)
{
return preg_match('!<title>(.*?)</title>!i', $html, $matches) ? $matches[1] : '';
}
function trim_display($size,$string)
{
$trim_string = substr($string, 0, $size);
$trim_string = $trim_string . "...";
return $trim_string;
}
$url = "http://www.nextbigwhat.com/indian-startups/";
$data = file_get_contents($url);
//$url = trim_url(5,$url);
$title = get_title($data);
echo "title is ; $title";
$content = plaintext($data);
$Preview = trim_display(100,$content);
echo '<br/>';
echo "preview is: $Preview";
?>
网址标题正确显示。但是当我从描述中排除标题内容时,即使它出现了。
我使用$plaintext = preg_replace('#([<]title)(.*)([<]/title[>])#', ' ', $html);
从纯文本中排除标题。
正则表达式是正确的,因为它不排除标题内容。
这里有什么问题?
我们得到的输出是:
title is ; Indian Startups Archives - NextBigWhat.com
preview is: Indian Startups Archives : NextBigWhat.com [whatever rest text]...
实际上标题部分中出现的文字不应再次出现在预览中。这就是我想要排除它并在预览中显示其余文字的原因。
答案 0 :(得分:2)
如何解决这个错误
如果你仔细观察标题和预览,它们会有所不同。让我们看看卷曲的输出。
echo plaintext($data);
好吧,它似乎有两个标题:
<title>
Indian Startups Archives : NextBigWhat.com</title>
和
<title>Indian Startups Archives - NextBigWhat.com</title>
然后get_title
函数正在检索第二个标题,plaintext
单独留下第一个标题。他们之间有什么区别?换行!因此你的正则表达式不匹配带换行符的标题,这就是正则表达式中的/ s选项修饰符存在的原因!
tl; dr
你的正则表达式错了,添加's'。
$plaintext = preg_replace('#([<]title)(.*)([<]/title[>])#s', ' ', $html);`
而不是
$plaintext = preg_replace('#([<]title)(.*)([<]/title[>])#', ' ', $html);`