PHP разобрать код из HTML - PullRequest
2 голосов
/ 29 июня 2011

У меня проблемы с анализом RSS Новостей Google с помощью PHP. XML-описание содержит много беспорядка, мне нужны только две небольшие части, но я не знаю, как извлечь только нужные части. Я пытался получить с PHP preg_macth, но я не добился успеха.

Пожалуйста, смотрите следующий код, я добавил комментарий в тексте, какие части я пытаюсь получить.

PS. Извините, это выглядит немного испорченным, но вот как выглядит новость от Google:

<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 голосов
/ 29 июня 2011

Вот функция 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'));
0 голосов
/ 29 июня 2011

Вы можете легко получить img src, используя http://www.php.net/manual/en/class.simplexmliterator.php, как указано ранее;однако извлечение этой конкретной строки текста из ленты кажется сложным.Похоже, что нет никакого уникального идентификатора для этого «описания».

0 голосов
/ 29 июня 2011

не уверен, поможет ли это, но вы можете взглянуть на функцию PHP "strip_tags"

...