从页面html中删除标题内容

时间:2013-11-07 05:36:59

标签: php regex

这里我正在为url创建预览。显示

  1. 网址标题
  2. 网址描述(标题不应该出现在此)
  3. 这是我的尝试。

    <?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]...
    

    实际上标题部分中出现的文字不应再次出现在预览中。这就是我想要排除它并在预览中显示其余文字的原因。

1 个答案:

答案 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);`