Работа с HTML-кодом в PHP (интеллектуальный способ декодирования)
Из 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.');
Лента новостей на испанском языке, после загрузки файла я проанализировал всю информацию в один var, содержащий только содержимое тега <description>
каждого <item>
. Ну, проблема в том, что когда я повторяю var, вся информация имеет html-код, например:
echo($result);
// этот отпечаток: el ministerio pãºblico расследует общественные дела в качестве примера для подражания
Ну, я могу создать ОГРОМНЫЙ пример случая, который ищет каждый символ, может изменить его на соответствующий, например: ¡ для Á и так далее, но нет способа сделать это с помощью одной функции??? или еще лучше, нет способа загрузить содержимое в $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 answers
РЕДАКТИРОВАТЬ
Поскольку вы уже используете анализатор 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
}
Вы можете использовать DOMDocument
из PHP
для удаления тегов кодировки HTML.
И используйте функции преобразования кодировки также из PHP
, чтобы изменить кодировку этого жала.