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

Форум Регулярные Выражения

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

 

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

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

тема: Помогите с кодом парсера RSS-ленты
 
 автор: rafonets   (25.04.2011 в 21:16)   письмо автору
 
 

<?php
// Данные для mysql сервера
$dbhost "localhost"// Хост
$dbuser "anton"// Имя пользователя
$dbpass "anton"// Пароль
$dbname "anton"// Имя базы данных
$link mysql_connect($dbhost$dbuser$dbpass);
mysql_select_db($dbname$link);

for(
$i=1;$i<3;$i++){
$url "http://www.liveinternet.ru/search/?q=&cr=4&p=1&d1=&m1=&y1=&d2=&m2=&y2=&un=&jn=&fun=&pg=".$i;
$tag_in "<ul class=\"bloglist messagelist\">";
$tag_out"<div class=\"pageslist\">";
$content file_get_contents($url);
$position=strpos($content$tag_in);
$content=substr($content$position);
$position=strpos($content$tag_out);
$content=substr($content,0$position);
$content=strip_tags($content"<a>");
preg_match_all("/<a href=\"(.*)\" target=\"_blank\" /",$content,$ahref);
$ahref[1]=str_replace("profile","rss",$ahref[1]);
$ahref[1]=array_unique($ahref[1]);

$count=count($ahref[1])-1;
for(
$i=0;$i<3;$i++){
$rsscontent file_get_contents($ahref[1][$i]);
preg_match_all("/title>[^>]+>/",$rsscontent,$title);
preg_match_all("/description>[^>]+>/",$rsscontent,$description);
$count=count($title[1])-1;

/********как быть тут*******/
while($x=0;$x>10;$x++;){
echo 
"<h3>".substr($title[0][$x],13,-3)."</h3>";
echo 
"<p>".substr($description[0][$x],21,-3)."</p><br /><hr><br />";

}
/********как быть тут*******/
//print_r($title);
//print_r($description);
//$counter=count
//$date = date(Y.m.d);
//$query = "insert into anton values(0,'".$date."','story','title','url');  ";
//mysql_query($query, $link);
}
}
?>

скрипт парсит с поиска лайв интернет рсс ленты пользователей дальше парсит ленту пользователя и добавляет в бд название и описание новости (парсит только рсс дальше не уходит)
Вопрос /********как быть тут*******/
Какой код должен быть между этим блоком?

  Ответить  
 
 автор: cheops   (25.04.2011 в 21:20)   письмо автору
 
   для: rafonets   (25.04.2011 в 21:16)
 

А чего хотите добиться этим блоком?

  Ответить  
 
 автор: cheops   (25.04.2011 в 21:20)   письмо автору
 
   для: rafonets   (25.04.2011 в 21:16)
 

А чего хотите добиться этим блоком?

  Ответить  
 
 автор: rafonets   (25.04.2011 в 21:22)   письмо автору
 
   для: cheops   (25.04.2011 в 21:20)
 

Для начала хочу вывести все что межу <title> </title> & <description> </description>
Извините за неточность

  Ответить  
 
 автор: cheops   (25.04.2011 в 21:24)   письмо автору
 
   для: rafonets   (25.04.2011 в 21:22)
 

Вот что смущает, ссылки вы извлекаете при помощи регулярных выражений preg_match_all(), а тэги <title> и <description> при помощи строковых функций. Может все извлечем при помощи регулярных выражений?

PS Если с их составлением возникнут сложности - поможем.

  Ответить  
 
 автор: rafonets   (25.04.2011 в 21:30)   письмо автору
 
   для: cheops   (25.04.2011 в 21:24)
 

Я понял что вы имеете ввиду

$count=count($ahref[1])-1;
for($i=0;$i<3;$i++){
$rsscontent = file_get_contents($ahref[1][$i]);
preg_match_all("/\<title(.*)\/",$rsscontent,$title);
preg_match_all("/\<description(.*)\/",$rsscontent,$description);
$count=count($title[1])-1;
Дальше вытаскивать через preg_match_all но там хранится массив а массив и рег. выражение у меня не работают
while($x=0;$x>10;$x++;){
echo "<h3>".substr($title[0][$x],13,-3)."</h3>";
echo "<p>".substr($description[0][$x],21,-3)."</p><br /><hr><br />";

}

  Ответить  
 
 автор: rafonets   (25.04.2011 в 22:00)   письмо автору
 
   для: cheops   (25.04.2011 в 21:24)
 

Может у меня просто рег выражение не правильное?

  Ответить  
 
 автор: cheops   (25.04.2011 в 23:34)   письмо автору
 
   для: rafonets   (25.04.2011 в 22:00)
 

Да, выражения лучше подправить
/<title>(.+?)<\/title>/is
/<description>(.+?)<\/description>/is

  Ответить  
 
 автор: rafonets   (26.04.2011 в 10:32)   письмо автору
 
   для: cheops   (25.04.2011 в 23:34)
 

$count=count($ahref[1])-1;
for($i=0;$i<3;$i++){
$rsscontent = file_get_contents($ahref[1][$i]);
preg_match_all("/<title>(.+?)<\/title>/is",$rsscontent,$title);
preg_match_all("/<description>(.+?)<\/description>/is",$rsscontent,$description);
$count=count($title[1])-1;

print_r("<h3>".$title."</h3>");
print_r("<p>".$description."</p><br /><hr><br />");

Поставил ваше регулярное выражение перестало работать

Вот ошибка:

Array

Array

Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in Z:\home\anton\www\index.php on line 26
Array

Array

Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in Z:\home\anton\www\index.php on line 26
Array

Array

  Ответить  
 
 автор: rafonets   (26.04.2011 в 10:37)   письмо автору
 
   для: rafonets   (26.04.2011 в 10:32)
 

Еще проблема в том что в
$ahref[1]
несколько массивов типо
array(
array[0]
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
)
дальше идет не array[1]
а
array(
array[0]
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
)
array(
array[0]
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
0 > url ;
)
массив я не правильно написал

  Ответить  
 
 автор: cheops   (26.04.2011 в 10:49)   письмо автору
 
   для: rafonets   (26.04.2011 в 10:32)
 

Не работает потому, что $ahref[1][$i] является пустой строкой. Что это за элемент и откуда он берется? Лучше реализовать проверку значений этого массива, чтобы предотвратить возникновение таких ошибок в дальнейшем.

  Ответить  
 
 автор: rafonets   (26.04.2011 в 10:57)   письмо автору
 
   для: cheops   (26.04.2011 в 10:49)
 

в этой переменой сохраняются ссылки на rss ленты в массиве а как устроить проверку массива?

  Ответить  
 
 автор: cheops   (26.04.2011 в 11:20)   письмо автору
 
   для: rafonets   (26.04.2011 в 10:57)
 

Перед строкой
$rsscontent = file_get_contents($ahref[1][$i]);
поставьте следующую проверку
if(empty($ahref[1][$i])) continue;
чтобы пропустить пустые строки.

PS Но вообще по уму лучше разобраться откуда они вообще появляются в массиве $ahref.

  Ответить  
 
 автор: rafonets   (26.04.2011 в 11:23)   письмо автору
 
   для: cheops   (26.04.2011 в 11:20)
 

появляются они из-за array_unique
когда он удаляет все одинаковые то там не остается массив с значениями

Array
(
[0] => http://www.liveinternet.ru/users/rss_yugopolis/rss/
[1] => http://www.liveinternet.ru/users/rss_loveplanet_rus/rss/
)

А массив с значениями


Array
(
[0] => http://www.liveinternet.ru/users/rss_yugopolis/rss/
[24] => http://www.liveinternet.ru/users/rss_loveplanet_rus/rss/
)

Дальше я подсчитываю в коде количество 2 штуки
и подставляю в $ahref[1][0 потом 1 а не 24]

ошибку нашел но как ее исправить не понял (

  Ответить  
 
 автор: cheops   (26.04.2011 в 11:27)   письмо автору
 
   для: rafonets   (26.04.2011 в 11:23)
 

Тогда, вместо цикла for, лучше использовать цикл foreach - он пройдет по всем элементам массива от начала до конца, не затрагивая пропущенные ключи.

  Ответить  
 
 автор: rafonets   (26.04.2011 в 11:30)   письмо автору
 
   для: cheops   (26.04.2011 в 11:27)
 

не for начал работать уже только теперь я не могу вывести следующее

if(empty($ahref[$i])) continue;
    $rsscontent = file_get_contents($ahref[$i]);
Здесь все окей а вот ниже (((
    preg_match_all("/<title>(.+?)<\/title>/is",$rsscontent,$title);
    preg_match_all("/<link>(.+?)<\/link>/is",$rsscontent,$title);
    preg_match_all("/<description>(.+?)<\/description>/is",$rsscontent,$description);
    $count=count($title[1])-1;
    for($i=0;$i<30;$i++){
        print_r("<h3>".$title."</h3>");
        print_r("<p>".$description."</p><br /><hr><br />");




  Ответить  
 
 автор: rafonets   (26.04.2011 в 11:28)   письмо автору
 
   для: rafonets   (26.04.2011 в 11:23)
 

теперь я получаю то что надо )
но как обрезать title и description я пробую рег выражениями что вы мне дали только получаю array

  Ответить  
 
 автор: cheops   (26.04.2011 в 11:30)   письмо автору
 
   для: rafonets   (26.04.2011 в 11:28)
 

Вот эти строки
print_r("<h3>".$title."</h3>"); 
print_r("<p>".$description."</p><br /><hr><br />");
замените следующими
print_r("<h3>".$title[1]."</h3>"); 
print_r("<p>".$description[1]."</p><br /><hr><br />");

  Ответить  
 
 автор: rafonets   (26.04.2011 в 11:32)   письмо автору
 
   для: cheops   (26.04.2011 в 11:30)
 


<h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br /><h3>Array</h3><p>Array</p><br /><hr><br />

  Ответить  
 
 автор: cheops   (26.04.2011 в 11:35)   письмо автору
 
   для: rafonets   (26.04.2011 в 11:32)
 

Вообще-то результаты preg_match_all() следует обрабатывать в цикле, давайте изменим скрипт следующим образом
<?php
  
...
  for(
$i 0$i count($title[1]); $i++)
  {
    
print_r("<h3>".$title[1][$i]."</h3>"); 
    
print_r("<p>".$description[1][$i]."</p><br /><hr><br />");
  }
  ...
?>

  Ответить  
 
 автор: rafonets   (26.04.2011 в 11:51)   письмо автору
 
   для: cheops   (26.04.2011 в 11:35)
 

Благодарю пока все работает дальше буду программировать )

  Ответить  
 
 автор: rafonets   (26.04.2011 в 11:57)   письмо автору
 
   для: cheops   (26.04.2011 в 11:35)
 

Еще одна просьба

какое регулярное ворожение нужно
http://www.liveinternet.ru/users/rss_yugopolis/post163377027/
/rss_yugopolis/ может быть любое число и все такое наверное так да

preg_match_all("\http://www.liveinternet.ru/users/(.*)/post[0-9]/\/")

Так?

  Ответить  
 
 автор: cheops   (26.04.2011 в 12:02)   письмо автору
 
   для: rafonets   (26.04.2011 в 11:57)
 

А какие части хотите извлечь? Я бы стал отталкиваться от следующего регулярного выражения
<?php
  $url 
"http://www.liveinternet.ru/users/rss_yugopolis/post163377027/";
  
preg_match("|http://www.liveinternet.ru/users/([^/]+)/(post[0-9]+)/|"$url$out);
?>

  Ответить  
 
 автор: rafonets   (26.04.2011 в 12:12)   письмо автору
 
   для: cheops   (26.04.2011 в 12:02)
 

У меня выводиться все в таком виде

http://www.liveinternet.ru/users/rss_yugopolis/

Югополис | Новости Краснодара и Краснодарского края :: LiveInternet

rss_yugopolis

-----------------------------------------------------------------------

http://www.liveinternet.ru/users/rss_yugopolis/

41-летний, неоднократно судимый, мужчина подозревается в сексуальном надругательстве над 8-летней девочкой. http://www.yugopolis.ru/news/incidents/2011/04/26/16561

Югополис | Новости Краснодара и Краснодарского края

-----------------------------------------------------------------------

http://www.liveinternet.ru/users/rss_yugopolis/post163377028/

В Стамбуле завершился чемпионат Европы по дзюдо. Сборная России, которая была представлена здесь сильнейшим составом, завоевала восемь медалей. http://www.yugopolis.ru/news/sport/2011/04/26/16560

В Краснодарском крае задержан педофил

-----------------------------------------------------------------------

Надо эти ссылки вытащить и ихний html получить дальше через strip_tags оставить только текст и добавить в базу данных поле story вместе с description линк дальше не нужен title нужен

  Ответить  
 
 автор: cheops   (26.04.2011 в 12:34)   письмо автору
 
   для: rafonets   (26.04.2011 в 12:12)
 

Тогда приведенное выше регулярное выражение должно подойти.

  Ответить  
Rambler's Top100
вверх

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