Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Помогите с регуляркой


Автор: systemIV 31.8.2011, 11:28
Давно не писал парсеров, а снипов или каких то примеров не осталось.
Помогите пожалуйста с регуляркой, вот что у меня вырисовывается, но ответ приходит нулевой.
Код

<?php
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://citycomfort.com.ua/');
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$indexPage = curl_exec($curl);
curl_close($curl);
preg_match_all('/<a href="http:\/\/citycomfort.com.ua\/?roomID=\d&city=\d">/iU', $indexPage, $content);
echo var_dump($content[0]);
?>

Подскажите, где здесь косяк?

Автор: s0lman 31.8.2011, 12:00
А что должно в итоге получиться?

Автор: systemIV 31.8.2011, 12:04
Ну в итоге мне нужно отпарсить ссылки

Автор: s0lman 31.8.2011, 12:26
как вариант
Код

/\<a href=("http:\/\/citycomfort.com\.ua\/[^ >]*)\>/is

как-то так

Автор: systemIV 31.8.2011, 14:07
s0lman, спасибо, помогло.
А вот ещё такой вопрос, как увеличить скорость??
Возможно я не так применяю парсер.
Его алгоритм примерно такой:
1. В цикле перебираю все страницы до последней
2. Инициализирую курл с УРЛ где подставляется номер страницы из цикла.
3. Из полученной страницы через регулярные выражения отбираю УРЛы на страницы.
4. Создаю цикл перебора полученых страниц, где также инициализирую ещё один экземпляр КУРЛа
5. Через регулярку во втором экземпляре записываю нужные мне данные в массив.

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

Автор: enoff 1.9.2011, 22:42
по поводу регулярок и простых функций - по сравнению с тратами на скачивание страниц, время на разбор в разы меньше.

экземпляр курла можно оставить один, менять только url.

можно использовать multi_curl, запускать дочерние скрипты фоном и т.д., но жутко это все неудобно. если любыми целями требуется ускорить работу парсера, то придеться извращаться.
ну и ширину канала увеличить, самый заметный прирост будет.

и при больших объемах (да и вообще в подобных скриптах) лучше уничтожать данные, которые больше не нужны. курл и сам пять жрет не слабо, и данных можно много насобирать. лучше сразу делать, а потом сложновато будет исправлять, пхп он такой  smile 

Автор: systemIV 10.9.2011, 00:44
Не хотел создавать новый топик. 
Мне нужно из тега TITLE и с самой страницы получить инфу.
Хочу оформить это всё единой регуляркой. Но вот возник вопрос, ведь между тегом заголовка и инфой которую мне нужно получить огромное пространство. как можно обозначить весь этот ненужный контент в регулярке??

Автор: voral 10.9.2011, 09:37
А зачем именно одной?
Не достаточно данных для ответа. А каким выражением вы хотите найти данные "с самой страницы"? Имхо, тут надо рассматривать конкретный случай и подобрать подходящий механизм, чтоб ".*" не вобрало в  себя и нужный контент

Автор: Absinthe 10.9.2011, 11:08
Есть такуя штука - профилирование(profiling). Она укажет, где косяк производительности. В данном случае в сети.

Цитата

А вот ещё такой вопрос, как увеличить скорость??
 Либо использовать асинхронные сокеты, либо переходить на другой язык и там использовать многопоточность(второй способ проще).


Автор: systemIV 12.9.2011, 18:00
По совету перешёл на сокеты.
Но вопрос снова не в этом)
Как можно с помощью регулярки(желательно одной)
Код

<select name="RegionSeoTitle" onchange="onRegionChange(this);">
<option value="kiev" selected>Киев</option> 
<option value="vinnitsa">Винница</option> 
<option value="dnepropetrovsk">Днепропетровск</option> 
<option value="donetsk">Донецк</option> 
<option value="zhitomir">Житомир</option> 
<option value="zaporozhje">Запорожье</option> 
<option value="ivano-frankovsk">Ивано-Франковск</option> 
<option value="kirovograd">Кировоград</option> 
<option value="crimea">Крым</option> 
<option value="lugansk">Луганск</option> 
<option value="lutsk">Луцк</option> 
<option value="lvov">Львов</option> 
<option value="nikolaev">Николаев</option> 
<option value="odessa">Одесса</option> 
<option value="poltava">Полтава</option> 
<option value="rovno">Ровно</option> 
<option value="sumy">Сумы</option> 
<option value="ternopol">Тернополь</option> 
<option value="uzhgorod">Ужгород</option> 
<option value="kharkov">Харьков</option> 
<option value="herson">Херсон</option> 
<option value="hmelnitskij">Хмельницкий</option> 
<option value="cherkassy">Черкаcсы</option> 
<option value="chernigov">Чернигов</option> 
<option value="chernovtsy">Черновцы</option>
</select>


Получить массив этих строк
Код

<option value="(.*?)">(.*?)</option>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)