PHP从html解析一些代码

时间:2011-06-28 21:38:22

标签: php html parsing rss

我在使用PHP解析Google新闻RSS时遇到了困难。 XML描述包含很多混乱,我只需要2个小部分,但我不知道如何只提取我想要的部分。我一直试图使用PHP preg_macth,但我没有成功。

请参阅以下代码,我在文本中添加了评论,我试图获得哪些部分。

PS。对不起,这看起来有些混乱,但这就是谷歌新闻rss:

<table border="0" cellpadding="2" cellspacing="7" style="vertical-align:top;">
<tr>
<td width="80" align="center" valign="top">
<font style="font-size:85%;font-family:arial,sans-serif">
    <a href="http://">
    <!-- i need only this img src only -->
    <img src="http://nt3.ggpht.com/news/tbn/ExvkIyaCiPpZwM/6.jpg" /><br />
    <!-- /till here -->
    <font size="-2">Moneycontrol.com</font></a>
</font>
</td>

<td valign="top" class="j"><font style="font-size:85%;font-family:arial,sans-serif"><br />

<div style="padding-top:0.8em;">
<img alt="" height="1" width="1" /></div>
<div class="lh">

    <a href="http://">
    <b>Microsoft&#39;s Office 365 to take on Google Apps in cloud software race</b>
    </a><br />

<font size="-1">
    <b><font color="#6f6f6f">Los Angeles Times</font></b>
</font><br />

<font size="-1">
<!----------------- i need only the following text ----------->
Microsoft Corp., the 800-pound gorilla of the software world, is hoping it can lift itself into the cloud. In announcing the general release of Office 365, the online version of its ubiquitous Microsoft Office suite that includes Word, <b>...</b>
<!------------------------- -till here ------------------>
</font><br />

<font size="-1">
    <a href="http://">Office 365: Microsoft Pitches Cloud, Eyes Profit</a>
    <font size="-1" color="#6f6f6f"><nobr>InformationWeek</nobr></font>
</font>
<br />

<font size="-1">
    <a href="http://">Microsoft Battles for Sky Supremacy With Office 365 Launch</a>
    <font size="-1" color="#6f6f6f"><nobr>TechNewsWorld</nobr></font>
</font><br />
...

非常感谢您宝贵的时间阅读并帮助我。

3 个答案:

答案 0 :(得分:0)

不确定这是否有帮助,但你可以看看PHP函数“strip_tags”

答案 1 :(得分:0)

这是我前几天写的strip_tags_ex函数(实际上是昨天)。它允许您指定应删除整个内容的标记。它还允许指定应在结果文本中保留属性的标记。

它可能无法完全满足您的需求,但它至少可以向您展示如何遍历DOM树并检查每个元素标记和属性。

对于荷兰语的评论感到抱歉。但是,代码是相当不言自明的。

<?php

/**
 * Helper function. Extraheert recursief tekst uit een DOMNode, met inachtneming van de opgegeven regels.
 */
function extract_text_from_node(DOMNode $node, &$index_attrs, &$remove_elements, array &$output)
{
    if ($node->nodeType == XML_TEXT_NODE)
    {
        // Huidige node is een tekstnode. Tekst outputten.
        $output[] = $node->data;
    }
    else
    {
        if ($node->nodeType == XML_ELEMENT_NODE)
        {
            // Huidige node is een element. Speciale behandeling;

            if (array_search($node->tagName, $remove_elements) !== false)
            {
                // Element staat in de lijst met uitzonderingen. Verder negeren.
                return;
            }

            if (array_key_exists($node->tagName, $index_attrs))
            {
                // Element staat in de lijst van tags waarvan ook attributen geëxporteerd moeten worden.
                $prefixed = false;
                // Voor elk opgegeven attribuut controleren of het bestaat.
                foreach($index_attrs[$node->tagName] as $attribute)
                {
                    $value = $node->getAttribute($attribute);
                    if ($value !== '')
                    {
                        // Attribuut gevonden. Outputten.

                        // Sommige tags voorzien van extra prefex, zodat de tekst van de attributen
                        // wat meer context krijgt in de uiteindelijke platte tekst.
                        if ($prefixed === false)
                        {
                            switch ($node->tagName)
                            {
                                case 'img': $output[] = 'Afbeelding: '; break;
                                case 'a': $output[] = 'Link: '; break;
                                default: break;
                            }
                            $prefixed = true;
                        }
                        // Attribute teruggeven met spaties er omheen.
                        $output[] = ' '.$value.' ';
                    }
                }
            }
        }

        // Willekeurige node. Als ie children heeft, dan recursief aanroepen.
        $child = $node->firstChild;
        while ($child)
        {
            extract_text_from_node($child, $index_attrs, $remove_elements, $output);
            $child = $child->nextSibling;
        }
    }
}

/**
 * strip_tags_ex extraheert tekst uit een html string.
 * @param string $string. De HTML code om in te zoeken
 * @param array $index_attrs. De elementen waarvan attributen ook teruggegeven moeten worden.
 * In de vorm array(tag=>array(attribute,...),...)
 * $param array of string $remove_elements. Array van elementen die helemaal, inclusief inhoud, genegeerd moeten worden.
 */
function strip_tags_ex($string, $index_attrs, $remove_elements)
{
    $dom = new DOMDocument;
    // Eventuele warning (die ontstaan bij ongeldige HTML) onderdrukken.
    @$dom->loadHTML($string);

    $output = array();

    $root = $dom->documentElement;

    // Tekst uit rootnode extraheren.
    extract_text_from_node($root, $index_attrs, $remove_elements, $output);

    // Resultaat-array samenvoegen tot een string.
    return implode('', $output);
}

$string = 'Hallo wereld';
echo strip_tags_ex(
    $string,
    array(
        'a'=>array('alt', 'title'),
        'img'=>array('alt')),
    array('div'));

答案 2 :(得分:0)

如前所述,您可以使用http://www.php.net/manual/en/class.simplexmliterator.php轻松获取img src;但是,从Feed中检索特定的文本行似乎很挑剔。该“描述”似乎没有任何唯一标识符。