Эта тема на forum.dklab.ru


h0rnd0g: Импорт RSS-лент в MySQL
вот что у меня есть...
$html выводит то что надо а именно рсс...

<?php

$link = array();
$link[0] = "http://www.overclockers.ru/rss/hardnews.rss";

$db_connection = mysql_connect($dbserver, $username, $password);
mysql_select_db($dbname,$db_connection);

$pattern = "/<item>\s*(.*(?!<item>.*<\/item>).*)\s*<\/item>/m";
$pattern2 = "/<title>(.*)<\/title>\s*<link>(.*)<\/link>\s*<description>(.*)<\/description>\s*<pubDate>(.*)<\/pubDate>/m";

@set_time_limit(1200);

foreach($link as $url) {

$n = array();

$ch = curl_init ($url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$html = curl_exec ($ch);
// echo $html;

preg_match_all($pattern, $html, $n, PREG_SET_ORDER);

foreach ($n as $new) {
++$i;
$ar = array();
preg_match($pattern2, $new[1], $ar);

$title = $ar[1];
$description = $ar[3];
$link = "http://".$ar[2];
$date = $ar[4];

$sql = "insert into x1_newstemp (`id` , `month` ,`year` ,`day`, `title_ukr` , `title_rus` , `author_ukr` , `author_rus` , `intro_ukr` , `intro_rus` , `text_ukr` , `text_rus`, `rub1`, `rub2`, `link` , `date` ) values ('', '', '', '', '".$title."', '".$title."', '', '', '".$description."', '".$description."', '', '', '', '', '".$link."', '".$date."');";
echo $sql;
mysql_query($sql);
}
}

echo "Всего ".$i." записей!";
curl_close ($ch);
?>

Дело до запроса в БД не доходит, вопрос банальный - почему???
Никита Косолaпов:
А что возвращает preg_match_all($pattern, $html, $n, PREG_SET_ORDER); ?
есть ли в $n хотя бы один элемент?
h0rnd0g:
подозреваю, проблема здесь...


$pattern = "/<item>\s*(.*(?!<item>.*<\/item>).*)\s*<\/item>/m";
$pattern2 = "/<title>(.*)<\/title>\s*<link>(.*)<\/link>\s*<description>(.*)<\/description>\s*<pubDate>(.*)<\/pubDate>/m";

Zett:
Замените эти две строки на:
$pattern = "/<item>(.*)<\/item>/smxU";
$pattern2 = "/<title>(.*)<\/title>\s*<link>(.*)<\/link>\s*<description>(.*)<\/description>\s*<pubDate>(.*)<\/pubDate>/smx";

h0rnd0g:
Zett Очень благодарен! Заработало... Еще вопросик, а как правильно выбрать формат для поля date, чтобы с датой в таком специфическом виде конвертировать в что-нить более дружелюбное???

Вот правда сделал по аналогии с <category></category> - почему все перестало работать :(

И с CDATA тоже проблема, не хочет хавать ее... :(

$pattern2 = "/<title><\!\[CDATA\[(.*)]]<\/title>\s*<link>(.*)<\/link>\s*<description><\!\[CDATA\[(.*)]]<\/description>\s*<pubDate>(.*)<\/pubDate>\s*<category><!\[CDATA\[(.*)]]<\/category>/smx";

так тоже не катит :((
Zett:
1. Насчет даты я рекомендую преобразовывать ее в timestamp и сохрнять в БД именно в этом формате, а из него вы уже любой формат создадите (хоть из РНР, хоть из мускуля). Для этих целей обычно хватает функции strtotime(). Получится что-то вроде:
$dt = strtotime($dt);
2. Уточните вопрос по Вот правда сделал по аналогии с <category></category> - почему все перестало работать :(
3. Ошибка в синтаксисе патерна. Во-первых нет закрывающей угловой скобки возле CDATA, а во-вторых такой патерн будет работать только при условии, что CDATA присутствует обязательно. Я рекомендую упростить патерн до предыдущего, а CDATA можно вырезать например так:
//обработка CDATA XML
function cutCDATA($str) {
$pattern = "/\<!\[CDATA\[(.*)\]\]\>/";
$matches = array();
if(preg_match($pattern, $str, $matches)) {
return $matches[1];
} else {
return $str;
}
}
h0rnd0g:
Zett 1. я думаю по свой формат даты мне достаточно будет просто в поля день месяц год они так у меня разбиты (просто брать текущий день добавления материала :)

2.
$pattern2 = "/<title><\!\[CDATA\[(.*)]]<\/title>\s*<link>(.*)<\/link>\s*<description><\!\[CDATA\[(.*)]]<\/description>\s*<pubDate>(.*)<\/pubDate>\s*<category><!\[CDATA\[(.*)]]<\/category>/smx";
.........
preg_match($pattern2, $new[1], $ar);
$title = $ar[1];
echo $title;
$description = $ar[3];
$link = $ar[2];
$date = $ar[4];
$category = $ar[5];


$title ничего не выводит...

3. счас буду пробовать... получилось... но замечаю, если символ « в тексте то не пашет...

Эта тема на forum.dklab.ru