Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как вырезать CDATA из RSS
 
 автор: kis-kis   (20.03.2008 в 20:38)   письмо автору
 
 

Подскажите, пожалуйста, как вырезать 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   (24.03.2008 в 09:23)   письмо автору
 
   для: kis-kis   (20.03.2008 в 20:38)
 

Нет вариантов?

   
 
 автор: mihdan   (25.03.2008 в 10:02)   письмо автору
 
   для: kis-kis   (24.03.2008 в 09:23)
 

с помощью регулярок

   
 
 автор: kis-kis   (25.03.2008 в 10:45)   письмо автору
 
   для: mihdan   (25.03.2008 в 10:02)
 

А можно подробнее? Забудим наш предыдущий спор ))

   
 
 автор: Max Vasin   (25.03.2008 в 11:12)   письмо автору
 
   для: 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($parserXML_OPTION_CASE_FOLDING0);
    
xml_parser_set_option($parserXML_OPTION_SKIP_WHITE1);
    
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.

   
 
 автор: mihdan   (25.03.2008 в 14:26)   письмо автору
 
   для: Max Vasin   (25.03.2008 в 11:12)
 

Max Vasin, это при условии, что расширение для работы с XML поддерживается

   
 
 автор: Max Vasin   (25.03.2008 в 14:42)   письмо автору
 
   для: mihdan   (25.03.2008 в 14:26)
 

я так понимаю имеется в виду поддержка работы с xml хостингом?

----
Regards, Max Vasin.

   
 
 автор: mihdan   (25.03.2008 в 14:53)   письмо автору
 
   для: 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);
?>

   
 
 автор: kis-kis   (26.03.2008 в 11:14)   письмо автору
 
   для: mihdan   (25.03.2008 в 14:53)
 

Я так понял, что вместо finction test() {} должна стоять переменная?


<? 
$string 
'[CDATA[finction test() {}]]'
$pattern '/<!\[CDATA\[.*?\]\]>/si'
echo 
preg_replace($pattern$replacement$string); 
?>

   
 
 автор: mihdan   (26.03.2008 в 11:40)   письмо автору
 
   для: kis-kis   (26.03.2008 в 11:14)
 

Нет там должно стоять то что стоит обычно между тегами - строку из которой вы вырезаете!!! Вы же сами этого просили

   
 
 автор: kis-kis   (26.03.2008 в 11:53)   письмо автору
 
   для: mihdan   (26.03.2008 в 11:40)
 

Я это и имел ввиду ))

Получается, так:


<?  
$string 
'$title';  
$pattern '/<!\[CDATA\[.*?\]\]>/si';  
echo 
preg_replace($pattern$replacement$string);  
?>


Правильно?

   
 
 автор: mihdan   (26.03.2008 в 15:25)   письмо автору
 
   для: kis-kis   (26.03.2008 в 11:53)
 

Ну да

   
 
 автор: Atheist   (25.03.2008 в 15:02)   письмо автору
 
   для: 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); 
    }     
}

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования