Работа с HTML-кодом в PHP (интеллектуальный способ декодирования) - PullRequest
3 голосов
/ 15 августа 2010

из PHP-скрипта. Я загружаю RSS-канал, например:

$fp = fopen('http://news.google.es/news?cf=all&ned=es_ve&hl=es&output=rss','r') 
 or die('Error reading RSS data.'); 

Фид - это испанская новостная лента, после загрузки файла я анализировал всю информацию в одной переменной, в которой есть толькосодержимое тега <description> каждого <item>.Ну, проблема в том, что когда я повторяю переменную, вся информация имеет html-код, например:

echo($result); // этот отпечаток: el officio pãºblico investigarã¡ la publicaciã³nen la primera pã¡gina

Ну, я могу создать ОГРОМНЫЙ экземпляр, который ищет каждый символ, может изменить его на соответствующий, например: ã¡ для и тд и тп, но нет способа сделать это с помощью одной функции ???или, что еще лучше, невозможно загрузить контент в $ fp без html-кодировки ?Спасибо!

Актуальный код:

<?php
$acumula="";
$insideitem = false; 
$tag = ''; 
$title = ''; 
$description = ''; 
$link = ''; 

function startElement($parser, $name, $attrs) { 
 global $insideitem, $tag, $title, $description, $link; 
 if ($insideitem) { 
  $tag = $name; 
 } elseif ($name == 'ITEM') { 
  $insideitem = true; 
 } 
} 




function endElement($parser, $name) { 
 global $insideitem, $tag, $title, $description, $link, $acumula; 
 if ($name == 'ITEM') { 
  $acumula = $acumula . (trim($title)) . "<br>" . (trim($description)); 
  $title = ''; 
  $description = ''; 
  $link = ''; 
  $insideitem = false; 
 } 
} 

function characterData($parser, $data) { 
 global $insideitem, $tag, $title, $description, $link; 
 if ($insideitem) { 
 switch ($tag) { 
  case 'TITLE': 
  $title .= $data; 
  break; 
  case 'DESCRIPTION': 
  $description .= $data; 
  break; 
  case 'LINK': 
  $link .= $data; 
  break; 
 } 
 } 
} 

$xml_parser = xml_parser_create(); 
xml_set_element_handler($xml_parser, 'startElement', 'endElement'); 
xml_set_character_data_handler($xml_parser, "characterData"); 
$fp = fopen('http://news.google.es/news?cf=all&ned=es_ve&hl=es&output=rss','r') 
or die('Error reading RSS data.'); 
while ($data = fread($fp, 4096)) { 
 xml_parse($xml_parser, $data, feof($fp)) 
  or die(sprintf('XML error: %s at line %d', 
 xml_error_string(xml_get_error_code($xml_parser)), 
 xml_get_current_line_number($xml_parser))); 
} 
//echo $acumula;
fclose($fp); 
xml_parser_free($xml_parser); 
echo($acumula); // THIS IS $RESULT!
?>

Ответы [ 2 ]

3 голосов
/ 15 августа 2010

EDIT

Поскольку вы уже используете синтаксический анализатор XML, вы гарантированно кодируете UTF-8.

Если ваша страница закодирована в ISO-8859-1 или даже в ASCII, вы можете сделать это для преобразования:

$result = mb_convert_encoding($result, "HTML-ENTITIES", "UTF-8");

Используйте библиотеку, которая обрабатывает это для вас, например. расширение DOM или SimpleXML. Пример:

$d = new DOMDocument();
$d->load('http://news.google.es/news?cf=all&ned=es_ve&hl=es&output=rss');
//now all the data you get will be encoded in UTF-8

Пример с SimpleXML :

$url = 'http://news.google.es/news?cf=all&ned=es_ve&hl=es&output=rss';
if ($sxml = simplexml_load_file($url)) {
    echo htmlspecialchars($sxml->channel->title); //UTF-8
}
0 голосов
/ 15 августа 2010

Вы можете использовать DOMDocument из PHP для удаления тегов кодировки HTML.И используйте функции преобразования кодировки также из PHP, чтобы изменить кодировку этой строки.

...