Думаю, что 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 формируется из ваших данных, которые в этом же скрипте могут браться из БД, файлов, ещё как-то вычисляться и т. п., после чего фида просто выводится клиенту(браузеру, спайдеру) с заполненными данными.
Но скорее всего, у вас на этом сайте стоит какой-то движок, и вот формирование рсс потоков у многих встроено и делается штатными средствами, что более правильно. Если стоит самопис, который не формирует ленты, можете делать как в этом примере или воспользоваться готовым решением (что и рекомендуется сделать)
Вы заблуждаетесь, как в количестве картинок, так и в группе символов основного паттерна.
Для одного 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 - исходник скачанной (кУРЛом или ещё чем) страницы