[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разложение на составляющие
Эли4ка
Возникли трудности с разбором получаемого текста
вид его примерно такой:
<item>
<title>
EA готовит плацдарм для анонса Medal of Honor 2 [48]</title>
<link>
http://news.playground.ru/35371/</link>

<pubDate>
Tue, 07 Feb 2012 21:11:00 +0400</pubDate>
<guid
isPermaLink="true">http://news.playground.ru/35371/</guid>
<description>
Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно,...</description>
<fulltext>
Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно, Medal of Honor 2 выпала честь возглавить осенний игровой парад «Электроников» образца 2012-го года. В свете отсутствия следующей флагманской игры в серии Battlefield этому сложно удивляться. </fulltext>
<enclosure
url="http://www.playground.ru/images/news/35371.jpg" type="image/jpeg" />
</item>



При использовании регулярки вида
<?php
set_time_limit(0);
$url = '';
$rss = file_get_contents($url);
preg_match_all("@<item>(.*?)</item>@iuUs",$rss, $regs);
echo '<pre>'.htmlspecialchars(print_r($regs, 1)).'</pre>';
?>

В получаемом коде обрезает item почему?



Спустя 13 минут, 54 секунды (18.02.2012 - 08:41) #8bit написал(а):
потому что ты запоминаеш выражение в скобках -(.*?) - в переменную 1, а item стоит за скобками. Если надо выдернуть все вместе с итемами просто убери скобки

Спустя 3 часа, 5 минут, 53 секунды (18.02.2012 - 11:47) Эли4ка написал(а):
#8bit
а понятно,спасибо,сейчас попробую. dry.gif

Спустя 23 минуты, 51 секунда (18.02.2012 - 12:11) Эли4ка написал(а):
а как с помощью цикла foreach мне разобрать массив на отдельные данные и выполнить далее какие-нибудь действия?а то конструкция вида
foreach ($regs as $material) {
echo $material;
}
что-то неработает.. :(

Спустя 1 час, 44 минуты, 55 секунд (18.02.2012 - 13:56) #8bit написал(а):
В массиве $regs что-нибудь есть? Посмотри через var_dump($regs)

Спустя 17 минут, 39 секунд (18.02.2012 - 14:13) walerus написал(а):
Эли4ка - Ты парсишь RSS я так вижу? если да, то вот функция, самописная, если чего - подредактируй для себя. Или выложи полностью вариант того что нужно распарсить, допилим вместе.

<?php

static function
get_field( $data )
{
$result = array();
$result_title = array();

preg_match('~<title>(.*)</title>~iUs', $data, $match_title);

if ( !isset( $match_title[1] ) )
{
echo " No TITLE";
return array();
}

$match_title = trim(str_replace(array('<![CDATA[', ']]>'), array('', '') ,$match_title[1]));

preg_match('~<link>(.*)</link>~iUs', $data, $match_link);

if ( !isset( $match_link[1] ) )
{
echo " No LINK";
return array();
}

$match_link = trim(str_replace(array('<![CDATA[', ']]>'), array('', '') ,$match_link[1]));

preg_match('~<description>(.*)</description>~iUs', $data, $match_description);
if ( !isset( $match_description[1] ) )
{
echo " No DESCRIPTION";
return array();
}

$match_description = trim(str_replace(array('<![CDATA[', ']]>'), array('', '') ,$match_description[1]));

$result_title = array( 'title' => trim($match_title), 'link' => trim($match_link), 'description' => trim($match_description) );

// посты
preg_match_all('~<item>(.*)</item>~iUs', $data, $all_post);

foreach($all_post[1] as $post)
{
preg_match('~<title>(.*)</title>~iUs', $post, $match_title_post);
$match_title_post = trim(str_replace(array('<![CDATA[', ']]>'), array('', '') ,$match_title_post[1]));

preg_match('~<link>(.*)</link>~iUs', $post, $match_link_post);
$match_link_post = trim(str_replace(array('<![CDATA[', ']]>'), array('', '') ,$match_link_post[1]));
$match_link_post = trim(preg_replace(array('~<a href="~iUs', '~">.*$~'), '' ,$match_link_post));

preg_match('~<description>(.*)</description>~iUs', $post, $match_description_post);
$match_description_post = trim(str_replace(array('<![CDATA[', ']]>'), array('', '') ,$match_description_post[1]));

preg_match('~<category>(.*)</category>~iUs', $post, $match_category_post);
if (isset($match_category_post[1]) && trim($match_category_post[1]) != '')
$match_category_post = trim(str_replace(array('<![CDATA[', ']]>'), array('', '') ,$match_category_post[1]));
else
$match_category_post = '';

$result[] = array(
'url' => trim( $match_link_post ),
'ancore' => trim($match_title_post),
'description' => trim($match_description_post),
'category' => trim($match_category_post)
);

}

return array( 'data_of_rss' => $result_title, 'links_of_rss' => $result );
}

Спустя 25 минут, 38 секунд (18.02.2012 - 14:39) walerus написал(а):
Или конкретно твой случай...

Входящие данные: Размножил текст и сменил вид ссылок и текста, чтоб было видно как парсит.
Свернутый текст
$text = '<item>
<title>EA готовит плацдарм для анонса Medal of Honor 1</title>
<link>http://news.playground.ru/1/</link>

<pubDate>Tue, 07 Feb 2012 21:11:00 +0400</pubDate>
<guid isPermaLink="true">http://news.playground.ru/1/</guid>
<description>1111 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно,...</description>
<fulltext>1111 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно, Medal of Honor 2 выпала честь возглавить осенний игровой парад «Электроников» образца 2012-го года. В свете отсутствия следующей флагманской игры в серии Battlefield этому сложно удивляться. </fulltext>
<enclosure url="http://www.playground.ru/images/news/1.jpg" type="image/jpeg" />
</item>

<item>
<title>EA готовит плацдарм для анонса Medal of Honor 2</title>
<link>http://news.playground.ru/2/</link>

<pubDate>Tue, 07 Feb 2012 21:11:00 +0400</pubDate>
<guid isPermaLink="true">http://news.playground.ru/2/</guid>
<description>2222 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно,...</description>
<fulltext>2222 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно, Medal of Honor 2 выпала честь возглавить осенний игровой парад «Электроников» образца 2012-го года. В свете отсутствия следующей флагманской игры в серии Battlefield этому сложно удивляться. </fulltext>
<enclosure url="http://www.playground.ru/images/news/2.jpg" type="image/jpeg" />
</item>

<item>
<title>EA готовит плацдарм для анонса Medal of Honor 3</title>
<link>http://news.playground.ru/3/</link>

<pubDate>Tue, 07 Feb 2012 21:11:00 +0400</pubDate>
<guid isPermaLink="true">http://news.playground.ru/3/</guid>
<description>3333 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно,...</description>
<fulltext>3333 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно, Medal of Honor 2 выпала честь возглавить осенний игровой парад «Электроников» образца 2012-го года. В свете отсутствия следующей флагманской игры в серии Battlefield этому сложно удивляться. </fulltext>
<enclosure url="http://www.playground.ru/images/news/3.jpg" type="image/jpeg" />
</item>
'
;


Сам код:
Свернутый текст
function parseRSS( $text )
{
// Ищем все <item>
preg_match_all( '~<item>(.*)</item>~iUs', $text, $all_post );

// Проверяем есть ли посты
if ( !isset( $all_post[1] ) )
return array( 'error' => true, 'msg' => 'Не найдены посты' );

$result = array();
foreach( $all_post[1] as $all_post_value )
{
// Проверяем есть ли тайтл
preg_match('~<title>(.*)</title>~iUs', $all_post_value, $match_title_post );
$tmp_title = '';
if ( isset( $match_title_post[1] ) )
$tmp_title = trim( $match_title_post[1] );

// Проверяем есть ли link
preg_match('~<link>(.*)</link>~iUs', $all_post_value, $match_link_post );
$tmp_link = '';
if ( isset( $match_link_post[1] ) )
$tmp_link = trim( $match_link_post[1] );

// Проверяем есть ли pubDate
preg_match('~<pubDate>(.*)</pubDate>~iUs', $all_post_value, $match_pubDate_post );
$tmp_pubDate = '';
if ( isset( $match_pubDate_post[1] ) )
$tmp_pubDate = trim( $match_pubDate_post[1] );

// Проверяем есть ли guid
preg_match('~<guid.*>(.*)</guid>~iUs', $all_post_value, $match_guid_post );
$tmp_guid = '';
if ( isset( $match_guid_post[1] ) )
$tmp_guid = trim( $match_guid_post[1] );

// Проверяем есть ли description
preg_match('~<description>(.*)</description>~iUs', $all_post_value, $match_description_post );
$tmp_description = '';
if ( isset( $match_description_post[1] ) )
$tmp_description = trim( $match_description_post[1] );

// Проверяем есть ли fulltext
preg_match('~<fulltext>(.*)</fulltext>~iUs', $all_post_value, $match_fulltext_post );
$tmp_fulltext = '';
if ( isset( $match_fulltext_post[1] ) )
$tmp_fulltext = trim( $match_fulltext_post[1] );

$result[] = array(
'title' => $tmp_title,
'link' => $tmp_link,
'pubDate' => $tmp_pubDate,
'guid' => $tmp_guid,
'description' => $tmp_description,
'fulltext' => $tmp_fulltext,
);

}

return array( 'error' => false, 'msg' => 'Найдены посты', 'result' => $result );
}

$result = parseRSS( $text );

if ( $result['error'] )
{
echo "Ошибка - " . $result['msg'] . "<br>\n";
}
else
{
echo $result['msg'] . "<br>\n";

print_r( $result['result'] );
}


Результат:
Свернутый текст
Найдены посты<br>
Array
(
[0] => Array
(
[title] => EA готовит плацдарм для анонса Medal of Honor 1
[link] => http://news.playground.ru/1/
[pubDate] => Tue, 07 Feb 2012 21:11:00 +0400
[guid] => http://news.playground.ru/1/
[description] => 1111 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно,...
[fulltext] => 1111 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно, Medal of Honor 2 выпала честь возглавить осенний игровой парад «Электроников» образца 2012-го года. В свете отсутствия следующей флагманской игры в серии Battlefield этому сложно удивляться.
)

[1] => Array
(
[title] => EA готовит плацдарм для анонса Medal of Honor 2
[link] => http://news.playground.ru/2/
[pubDate] => Tue, 07 Feb 2012 21:11:00 +0400
[guid] => http://news.playground.ru/2/
[description] => 2222 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно,...
[fulltext] => 2222 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно, Medal of Honor 2 выпала честь возглавить осенний игровой парад «Электроников» образца 2012-го года. В свете отсутствия следующей флагманской игры в серии Battlefield этому сложно удивляться.
)

[2] => Array
(
[title] => EA готовит плацдарм для анонса Medal of Honor 3
[link] => http://news.playground.ru/3/
[pubDate] => Tue, 07 Feb 2012 21:11:00 +0400
[guid] => http://news.playground.ru/3/
[description] => 3333 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно,...
[fulltext] => 3333 Похоже, что гадание на кофейной гуще отменяется. Давеча Electronic Arts начала рассылать западным журналистам приглашения, украшенные подозрительно знакомой эмблемой и аббревиатурой MOH, на специальное мероприятие для прессы, которое пройдет шестого марта этого года. Все правильно, шестого марта – в один день с поступлением в продажу свежего номера PSM3, тизер-страничка которого в разнузданной манере возвещает об анонсе какого-то «загадочного» и очень «горячего» шутера.
В том, что им окажется именно Medal of Honor 2, теперь нет никаких сомнений. Осенняя линейка проектов Electronic Arts сейчас состоит из одного вакуума, так что в ближайшие несколько месяцев компания просто обязана начать заполнение пробелов. Как видно, Medal of Honor 2 выпала честь возглавить осенний игровой парад «Электроников» образца 2012-го года. В свете отсутствия следующей флагманской игры в серии Battlefield этому сложно удивляться.
)

)

Спустя 42 минуты, 10 секунд (18.02.2012 - 15:21) Winston написал(а):
Чем не подходит simplexml или DOM?

Спустя 14 часов, 8 минут, 45 секунд (19.02.2012 - 05:30) Эли4ка написал(а):
Winston
я как раз на это в гугле наткнулась..ничего так..проще да и поудобнее вроде.
walerus
ничего себе,спасибо за код..но я нашла вариант попроще..

Спустя 10 часов, 16 минут, 26 секунд (19.02.2012 - 15:46) walerus написал(а):
Эли4ка - Ну выложила бы вариант "попроще", я бы себе тоже код поправил, и занес бы в архив нужностей rolleyes.gif

Спустя 16 часов, 59 минут, 23 секунды (20.02.2012 - 08:46) Эли4ка написал(а):
walerus
Вам надо чисто спарсить новость? :huh: ,если да то вот
<?
set_time_limit(0);
$url = 'http://news.yandex.ru/politics.rss'; //адрес RSS ленты
$rss = simplexml_load_file($url); //Интерпретирует XML-файл в объект
//цикл для обхода всей RSS ленты

foreach ($rss->channel->item as $item) {
echo $item->title.'<br>';
echo $item->link.'<br>';
echo $item->description.'<br>';
}
?>

Только его функцией iconv адо подправить.а то кракозябры выводит.. :rolleyes:

Спустя 2 часа, 19 минут, 41 секунда (20.02.2012 - 11:05) walerus написал(а):
Эли4ка - Окей ), спасибо )

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.