nomadsolutions

Рейтинг
0
Регистрация
05.11.2010

Думаю, что DOM в вашем случае лишнее, будет проще формировать RSS напрямую, выводя фиду подставляя на лету соотв значения переменных в структуру нужной версии фиды и т.д. например так (файл feed.php)


<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
<title>Новости</title>
<link>http://example.com/</link>
...
формирование $feed_data
...
<?php foreach ($feed_data as $feed_item): ?>
<item>
<title><?php echo $feed_item['title']; ?></title>
<link><?php echo $feed_item['url']; ?></link>
<guid isPermaLink="false"><?php echo $feed_item['url']; ?></guid>
<description><![CDATA[<?php echo $feed_item['description']; ?>]]></description>
<pubDate><?php echo $feed_item['pubDate']; ?></pubDate>
<category><![CDATA[<?php echo $feed_item['category']; ?>]]></category>
</item>
<?php endforeach; ?>
</channel>
</rss>

для этого примера, формат $feed_data может быть например такой:


// это пример структуры, сами же данные должны генериться динамически (браться из БД, вычисляться соотв. образом - например pubDate и т.д.)
$feed_data = array(
array('title' => 'title1', 'url' => 'url 1', 'description' => 'description 1', 'pubDate' => 'pubDate 1', 'category'=> 'category 1'),
array('title' => 'title2', 'url' => 'url 2', 'description' => 'description 2', 'pubDate' => 'pubDate 2', 'category'=> 'category 2'),
...............
);

здесь, массив $feed_data формируется из ваших данных, которые в этом же скрипте могут браться из БД, файлов, ещё как-то вычисляться и т. п., после чего фида просто выводится клиенту(браузеру, спайдеру) с заполненными данными.

Но скорее всего, у вас на этом сайте стоит какой-то движок, и вот формирование рсс потоков у многих встроено и делается штатными средствами, что более правильно. Если стоит самопис, который не формирует ленты, можете делать как в этом примере или воспользоваться готовым решением (что и рекомендуется сделать)

siv1987:
Там три src отвечающие за вывод капчи)))
programm, тебе подсказка по регулярному выражению, каждый кусок рисунка начинается с x_image.
Заодно и регулярки подучишь, а то ходишь позоришь всех с таким ником)))))))

Вы заблуждаетесь, как в количестве картинок, так и в группе символов основного паттерна.

Для одного IP:


<div id="capthaImagesContainer">
<img alt="" style="border: 1px solid gray;" src="x_get_image_v3?17856759656&x_reg_id=regV3_Yjg4FiP" height="240" width="360">
</div>

для другого ИП после рефреша:


<table id="capthaImagesContainer" cellpadding="0" cellspacing="0">
<tbody><tr>
<td><img src="x_image?498740637&num=1&x_reg_id=ErkdYUWs" alt="" height="51" width="75"></td>
<td><img src="x_image?937473694&num=2&x_reg_id=ErkdYUWs" alt="" height="51" width="75"></td>
<td><img src="x_image?337264564&num=3&x_reg_id=ErkdYUWs" alt="" height="51" width="75"></td>
</tr>
</tbody></table>

Поскольку скрипт может находиться на сервере в какой угодно стране, то для рабочего примера нахождения требуемых УРЛов на капчи, следует использовать разбор DOM-дерева вместо регулярок, например так:


$ch = curl_init('http://win.mail.ru/cgi-bin/signup'); // Обработку куков и "беспалевный" квери_стринг я выкладывать не буду ;)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);

$in = curl_exec($ch);
curl_close($ch);

$query_parts = '//*[@id="capthaImagesContainer"]//img';

$captcha_cntr_id = 'capthaImagesContainer'; //id елемента-родителя для img с капчей(частями капчи)
$doc = new DOMDocument();
$doc->validate = true;
$doc->strictErrorChecking = false;
@$doc->loadHTML($in);
$doc->normalizeDocument();

$xp = new DOMXPath($doc);
$captcha_parts = $xp->query($query_parts);
$captcha_urls = array();
foreach($captcha_parts as $captcha_part) {
array_push($captcha_urls, 'http://win.mail.ru/cgi-bin/' . $captcha_part->getAttribute('src'));
}

// $captcha_urls содержит УРЛ на всю картинку или её части (в зависимости от того, с какого ИПа был запрос)

ТСу же, был показан просто пример, от которого он бы мог оттолкнуться в играх с регулярками, но опять таки повторюсь - решение, используешее регулярные выражения, в данном случае будет не универсально, либо слишком громоздко, кроме того, мейл ру может использовать любой другой тэг, в котором может быть находиться капча, а в случае разбора DOM мы вяжемся только к id элемента, который, в случае чего может быстро подстраиваться в конфиге либо вычисляться ещё как-то эмпирически, в зависимости от изменения процесса регистрации.

Но если разбор именно регулярками для ТС принципиален, то можно получить ноду контейнера ($doc->getElementById('capthaImagesContainer')) и уже после этого парсить регулркой её значение (там будет или сразу <img> или <tr><td><img>... или ещё что), но вариант с xpath, имхо, более универсальней.


if(!preg_match('/capthaImagesContainer.+src="(.+)"/Uis', $in, $captcha_url)) {
die("Couldn't parse captcha's URL");
}
$captcha_url = sprintf('http://win.mail.ru/cgi-bin/%s', $captcha_url[1]);

$in - исходник скачанной (кУРЛом или ещё чем) страницы