2011-06-28 81 views
2

我在使用PHP解析Google新聞RSS時遇到困難。 XML描述包含大量的混亂,我只需要從它的2個小部分,但我不知道我怎麼能只提取我想要的部分。我一直試圖用PHP preg_macth得到,但我沒有取得成功。PHP從html解析一些代碼

請參閱下面的代碼,我已經在文本中添加了我想要獲得的部分的評論。

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 /> 
... 

真的感謝您的寶貴時間讀這篇文章,並幫助我。

+0

像往常一樣,不要用正則表達式來分析html(甚至是xml)。使用DOM。 –

+0

這不是XML,也許這是CDATA,無論如何,你可以嘗試http://www.php.net/manual/en/class.simplexmliterator.php – streetparade

回答

0

不知道這是否會幫助,但你可以看看到PHP函數「用strip_tags」

+0

解析不是剝離,strip_tag刪除大多數HTML標記。 – streetparade

+0

我知道..但他需要HTML內的文字。他可以去掉標籤,然後解析一個更簡單的結果 – Fabrizio

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'));