0

在这里,我正在为 url 创建预览。这表明

  1. 网址标题
  2. 网址描述(标题不应出现在此)

这是我的尝试。

<?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";

?>

URL 标题显示正确。但是当我从描述中排除标题内容时,它甚至会出现。

我有用于$plaintext = preg_replace('#([<]title)(.*)([<]/title[>])#', ' ', $html);从纯文本中排除标题。

正则表达式是正确的,因为它不排除标题内容。

这里有什么问题?

我们在这里得到的输出是:

title is ; Indian Startups Archives - NextBigWhat.com
preview is: Indian Startups Archives : NextBigWhat.com [whatever rest text]...

实际上,出现在标题部分的文本不应该再次出现在预览中。这就是为什么我要排除它并在预览中显示其余文本。

4

1 回答 1

2

如何解开谜团

如果您仔细观察标题和预览,它们​​会有所不同。让我们看看 curl 的输出。

echo plaintext($data);

好吧,它似乎有两个标题:

<title>
Indian Startups Archives : NextBigWhat.com</title>

<title>Indian Startups Archives - NextBigWhat.com</title>

然后该get_title函数正在检索第二个标题并plaintext留下第一个标题。他们之间有什么区别?换行!因此您的正则表达式不匹配带有换行符的标题,这就是正则表达式中存在 /s 选项修饰符的原因!

tl;博士

你的正则表达式是错误的,添加's'。

$plaintext = preg_replace('#([<]title)(.*)([<]/title[>])#s', ' ', $html);`

代替

$plaintext = preg_replace('#([<]title)(.*)([<]/title[>])#', ' ', $html);`
于 2013-11-07T06:21:24.220 回答