|
|
|
| Подскажите, пожалуйста, как вырезать CDATA из RSS?
Заранее спасибо.
RSS обрабатывается следующим образом:
function GetXMLFirstVal($r,$t)
{
if(preg_match_all('/<('.$t.')[^>]{0,}>(.*)<\/\\1>/Usi',$r,$o)) return $o[2][0];
return '';
}
function GetXMLAllVal($r,$t)
{
if(preg_match_all('/<('.$t.')[^>]{0,}?>(.*)<\/\\1>/Usi',$r,$o)) return $o[2];
return array();
}
$file = "http://regnum.ru/rss/primorie.xml";
$XML = file_get_contents($file);
if(!$XML) continue;
$ITEMS = GetXMLAllVal($XML, 'item');
foreach($ITEMS as $item)
{
$title = GetXMLFirstVal($item, 'title');
$link = GetXMLFirstVal($item, 'link');
$text = GetXMLFirstVal($item, 'description');
$date = GetXMLFirstVal($item, 'pubDate');
$title = html_entity_decode($title, ENT_QUOTES);
$text = html_entity_decode($text, ENT_QUOTES);
}
|
Еще раз спасибо. | |
|
|
|
|
|
|
|
для: kis-kis
(20.03.2008 в 20:38)
| | Нет вариантов? | |
|
|
|
|
|
|
|
для: kis-kis
(24.03.2008 в 09:23)
| | с помощью регулярок | |
|
|
|
|
|
|
|
для: mihdan
(25.03.2008 в 10:02)
| | А можно подробнее? Забудим наш предыдущий спор )) | |
|
|
|
|
|
|
|
для: kis-kis
(25.03.2008 в 10:45)
| | вот зачем здесь регулярки если можно так
<table border=0 width=100%>
<?
function readDatabase($filename)
{
$data = implode("",file($filename));
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $tags);
xml_parser_free($parser);
foreach ($tags as $key=>$val) {
if ($key == "item") {
$molranges = $val;
for ($i=0; $i < count($molranges); $i+=2) {
$offset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - $offset;
$tdb[] = (array_slice($values, $offset, $len));
}
} else {
continue;
}
}
return @$tdb;
}
$db = readDatabase("primorie.xml");?>
<?
for ($i=0;$i<count($db);$i++){
$s=count($db[$i]);?><tr><td class=vmenubg><div style="font-size: small;border-top: 1px dotted silver; margin-top: 14px">
<? echo ($i+1).".<font color=Mediumblue> <span class=bar>".iconv("UTF-8","WINDOWS-1251" ,$db[$i][0]["value"])."</font>";
echo " <font color=Olive>(";
foreach ($db[$i] as $k=>$v) {
if ($v["tag"]=="category")
echo iconv("UTF-8","WINDOWS-1251" ,$v["value"])." ";}
echo ")</span><br>";
?>
<? echo "<b>Дата</b>: <u> ".iconv("UTF-8","WINDOWS-1251" ,$db[$i][$s-1]["value"])."</u><br> <b>CDATA</b>: ".iconv("UTF-8","WINDOWS-1251" ,$db[$i][$s-2]["value"])."\n";?></div></td></tr>
<?
}
?>
</table>
|
$db = readDatabase("primorie.xml"); вместо этого файла ставишь свой линк
----
Regards, Max Vasin. | |
|
|
|
|
|
|
|
для: Max Vasin
(25.03.2008 в 11:12)
| | Max Vasin, это при условии, что расширение для работы с XML поддерживается | |
|
|
|
|
|
|
|
для: mihdan
(25.03.2008 в 14:26)
| | я так понимаю имеется в виду поддержка работы с xml хостингом?
----
Regards, Max Vasin. | |
|
|
|
|
|
|
|
для: Max Vasin
(25.03.2008 в 14:42)
| | Естественно - поэтому и говорю, что можно регулярками. Но ваш вариант тоже работает ))
Если удалить надо
<?
$string = '<![CDATA[finction test() {}]]>';
$pattern = '/<!\[CDATA\[.*?\]\]>/si';
echo preg_replace($pattern, '', $string);
?>
|
если вырезать все меж тегов
<?
$string = '<![CDATA[finction test() {}]]>';
$pattern = '/<!\[CDATA\[(.*?)\]\]>/si';
echo preg_replace($pattern, "\$1", $string);
?>
|
| |
|
|
|
|
|
|
|
для: mihdan
(25.03.2008 в 14:53)
| | Я так понял, что вместо finction test() {} должна стоять переменная?
<?
$string = '[CDATA[finction test() {}]]';
$pattern = '/<!\[CDATA\[.*?\]\]>/si';
echo preg_replace($pattern, $replacement, $string);
?>
|
| |
|
|
|
|
|
|
|
для: kis-kis
(26.03.2008 в 11:14)
| | Нет там должно стоять то что стоит обычно между тегами - строку из которой вы вырезаете!!! Вы же сами этого просили | |
|
|
|
|
|
|
|
для: mihdan
(26.03.2008 в 11:40)
| | Я это и имел ввиду ))
Получается, так:
<?
$string = '$title';
$pattern = '/<!\[CDATA\[.*?\]\]>/si';
echo preg_replace($pattern, $replacement, $string);
?>
|
Правильно? | |
|
|
|
|
|
|
|
для: kis-kis
(26.03.2008 в 11:53)
| | Ну да | |
|
|
|
|
|
|
|
для: Max Vasin
(25.03.2008 в 11:12)
| | > $data = implode("",file($filename));
1. implode() не обзятельно требует такого расположения аргументов, т.е. можно просто $data = implode(file($filename));
2. Для подобной опреации существует file_get_contents().
> foreach ($tags as $key=>$val) {
> if ($key == "item") {
> $molranges = $val;
> for ($i=0; $i < count($molranges); $i+=2) {
> $offset = $molranges[$i] + 1;
> $len = $molranges[$i + 1] - $offset;
> $tdb[] = (array_slice($values, $offset, $len));
> }
> } else {
> continue;
> }
> }
Вот это вообще ... Не поддается разумному объяснению.
Это переписывается так:
<?php
if( isset($tags['item']) )
{
for ($i = 0; $i < count($tags['item']); $i += 2)
{
$offset = $tags['item'][$i] + 1;
$len = $tags['item'][$i + 1] - $offset;
$tdb[] = array_slice($values, $offset, $len);
}
}
|
| |
|
|
|