Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр 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($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.

   
 
 автор: 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 Яндекс.Метрика Яндекс цитирования