Делаю парсер но никак не получается. А задание такое:
Имеется код:
<div class="entry">
<div class="preview">
<a href="http://site.ru/index.php" rel="nofollow" target="_blank"><img alt="63338" border="0" src="/images/thumbs/1.jpg?1290252672" /></a>
</div>
<a href="http://site.ru/index.php" class="title" rel="nofollow" target="_blank">Название</a>
<div class="spam_warning" id="entry_63338_notice">
</div>
<div class="info">
<i>site.ru</i> — Описание
</div>
<div class="preview">
<a href="http://site2.ru/index.php" rel="nofollow" target="_blank"><img alt="63338" border="0" src="/images/thumbs/2.jpg?1290252672" /></a>
</div>
<a href="http://site2.ru/index.php" class="title" rel="nofollow" target="_blank">Название2</a>
<div class="spam_warning" id="entry_63338_notice">
</div>
<div class="info">
<i>site.ru</i> — Описание2
</div>
<div class="preview">
<a href="http://site3.ru/index.php" rel="nofollow" target="_blank"><img alt="63338" border="0" src="/images/thumbs/3.jpg?1290252672" /></a>
</div>
<a href="http://site3.ru/index.php" class="title" rel="nofollow" target="_blank">Название3</a>
<div class="spam_warning" id="entry_63338_notice">
</div>
<div class="info">
<i>site.ru</i> — Описание3
</div>
</div>
Нужно извлечь из этого списка тем ссылки, названия и описания.
DySprozin, пытался вытянуть (отпарсить) описание между </i> и </div>, но не получилось! В массиве thumd пусто :(
Где тут моя ошибка?
$text = file_get_contents( 'http://site.ru/' );
preg_match( '/^i>{2}[-,a-zA-Zа-яА-Я0-9]div>+$/', $text , $thumb[] );
print_r( $thumb );
Спустя 10 минут, 13 секунд (20.11.2010 - 20:36) DySprozin написал(а):
ak167
ну и в чем проблема? регулярка-то простенькая (;
ну и в чем проблема? регулярка-то простенькая (;
Спустя 5 минут, 55 секунд (20.11.2010 - 20:42) ak167 написал(а):
DySprozin, объясните мне пожалуйста что такое регулярка? Я просто парсеров никогда не делал.
Спустя 19 минут, 21 секунда (20.11.2010 - 21:01) DySprozin написал(а):
курим регулярку раз
курим регулярку двас
там настолько все понятно написано, что даже я понял (;
add
и да, не против, если на "ты"? По мне, выканье на форумах - как-то пластиково (не навязываю, но все-таки)
курим регулярку двас
там настолько все понятно написано, что даже я понял (;
add
и да, не против, если на "ты"? По мне, выканье на форумах - как-то пластиково (не навязываю, но все-таки)
Спустя 2 часа, 51 минута, 6 секунд (20.11.2010 - 23:52) ak167 написал(а):
DySprozin, пытался вытянуть (отпарсить) описание между </i> и </div>, но не получилось! В массиве thumd пусто :(
Где тут моя ошибка?
Где тут моя ошибка?
$text = file_get_contents( 'http://site.ru/' );
preg_match( '/^i>{2}[-,a-zA-Zа-яА-Я0-9]div>+$/', $text , $thumb[] );
print_r( $thumb );
Спустя 11 минут, 28 секунд (21.11.2010 - 00:04) DySprozin написал(а):
хм... давай разбирать твой шаблон:
/^i>{2}[-,a-zA-Zа-яА-Я0-9]div>+$/
^ - начало строки - это еще почему? разве хоть какая-то строка начинается с "i>"? убрать "^"!
i> - i и угловая скобка - логично...
{2} - ты говоришь: "угловая скобка должна быть два раза подряд"
дальше смотреть пока не буду, исправляй (; а то у тебя получилось:
"найди мне строку, начинающуюся на i>>"
/^i>{2}[-,a-zA-Zа-яА-Я0-9]div>+$/
^ - начало строки - это еще почему? разве хоть какая-то строка начинается с "i>"? убрать "^"!
i> - i и угловая скобка - логично...
{2} - ты говоришь: "угловая скобка должна быть два раза подряд"
дальше смотреть пока не буду, исправляй (; а то у тебя получилось:
"найди мне строку, начинающуюся на i>>"

Спустя 1 час, 38 минут, 19 секунд (21.11.2010 - 01:42) SlavaFr написал(а):
$pattern = '!href="([^"]+)" class="title"[^>]+>(.+)</a>.*<div class="info">.*>.*>(.+)</div>!sU';
$result = preg_match_all($pattern, $subject, $subpattern);
echo '<pre>'.print_r($subpattern, TRUE).'</pre>';
a по хорошим делам это делают при помощи DomDocument и XPath
Спустя 16 часов, 29 минут, 59 секунд (21.11.2010 - 18:12) ak167 написал(а):
Цитата |
хм... давай разбирать твой шаблон: /^i>{2}[-,a-zA-Zа-яА-Я0-9]div>+$/ ^ - начало строки - это еще почему? разве хоть какая-то строка начинается с "i>"? убрать "^"! i> - i и угловая скобка - логично... {2} - ты говоришь: "угловая скобка должна быть два раза подряд" дальше смотреть пока не буду, исправляй (; а то у тебя получилось: "найди мне строку, начинающуюся на i>>" |
DySprozin, действительно)))
Исправил вот так:
preg_match( '/^i{1}>{1}[-,a-zA-Zа-яА-Я0-9]div>+$/', $text , $thumb );
всеравно не работает! Теперь то что не так?
Цитата |
$pattern = '!href="([^"]+)" class="title"[^>]+>(.+)</a>.*<div class="info">.*>.*>(.+)</div>!sU'; $result = preg_match_all($pattern, $subject, $subpattern); echo '<pre>'.print_r($subpattern, TRUE).'</pre>'; |
SlavaFr, попробывал вставить ваш код. Не работает. Отображает больше чем нужно да и к тому же в непонятных символах вместо русских букв. Кстати, что это за символы?
Спустя 1 час, 17 минут, 23 секунды (21.11.2010 - 19:29) DySprozin написал(а):
хм... как тебе объяснить)) шило на мыло (;
^i - означает: строка начинается на i, ну где у тебя такая строка?
В принципе, могу накидать тебе шаблон, но ИМХО тебе полезней самому разобраться (;
^i - означает: строка начинается на i, ну где у тебя такая строка?

В принципе, могу накидать тебе шаблон, но ИМХО тебе полезней самому разобраться (;
Спустя 4 минуты, 45 секунд (21.11.2010 - 19:34) ak167 написал(а):
DySprozin, вот:
<i>site.ru</i> — Описание3
</div>
Я пытаюсь вырвать кусок с "i> - описание</div>". В идеале конечно нужно вырвать само описание, но я не знаю как. Поэтому вырываю этот кусок а затем с помощью str_replace удалю ненужные символы, чтобы осталось одно описание.
<i>site.ru</i> — Описание3
</div>
Я пытаюсь вырвать кусок с "i> - описание</div>". В идеале конечно нужно вырвать само описание, но я не знаю как. Поэтому вырываю этот кусок а затем с помощью str_replace удалю ненужные символы, чтобы осталось одно описание.
Спустя 8 минут, 3 секунды (21.11.2010 - 19:42) DySprozin написал(а):
;;DySprozin, вот:
ну и?)) строка-то у тебя начинается с <i>, так что либо
^<i>
либо совсем убрать "^" (;
шаблон для
вот:
дальше давай сам (;
ну и?)) строка-то у тебя начинается с <i>, так что либо
^<i>
либо совсем убрать "^" (;
шаблон для
<i>site.ru</i> — Описание3
</div>
вот:
/<\/i>[^<]+<\/div>/isU
дальше давай сам (;
Спустя 14 минут, 59 секунд (21.11.2010 - 19:57) DySprozin написал(а):
ах да, забыл, надо брать в скобки:
вариант1
/<\/i>([^<]+)<\/div>/isU
вариант2
#</i>([^<]+)</div>#isU
вариант3
#</i>([^<]+)$#isU
вариант1
/<\/i>([^<]+)<\/div>/isU
вариант2
#</i>([^<]+)</div>#isU
вариант3
#</i>([^<]+)$#isU
Спустя 1 час, 3 минуты, 22 секунды (21.11.2010 - 21:00) ak167 написал(а):
DySprozin, попробывал. Работает но с глюками. Вместо словосочетания "и тут наши "Катюши"... *@/!!!" выдает вот что:

Кодировка стоит windows-1251.
Из-за чего вылезает абракадабра вместо слов?
Кстати, он нашел вроде как описание одной темы, а мне нужно чтобы скрипт находил описание всех десяти тем! Как это осуществить?

Кодировка стоит windows-1251.
Из-за чего вылезает абракадабра вместо слов?
Кстати, он нашел вроде как описание одной темы, а мне нужно чтобы скрипт находил описание всех десяти тем! Как это осуществить?
Спустя 14 минут, 19 секунд (21.11.2010 - 21:15) DySprozin написал(а):
;;Как это осуществить?
preg_match_all юзай (;
;;Работает но с глюками.
а вот так?
#</i>([^<]+)$#isUu
preg_match_all юзай (;
;;Работает но с глюками.
а вот так?
#</i>([^<]+)$#isUu
Спустя 48 минут, 56 секунд (21.11.2010 - 22:04) ak167 написал(а):
DySprozin, так вообще не работает 

Спустя 6 часов, 33 минуты, 16 секунд (22.11.2010 - 04:37) DySprozin написал(а):
;;Из-за чего вылезает абракадабра вместо слов?
с другими кодировками играться не пробовал? попробуй вывод не на экран, а в другой файл (;
с другими кодировками играться не пробовал? попробуй вывод не на экран, а в другой файл (;
Спустя 5 часов, 41 минута, 9 секунд (22.11.2010 - 10:18) vergin написал(а):
попробуй это:
$pattern = "/<i>.+<\/div>/";
Спустя 2 дня, 9 часов, 47 минут, 6 секунд (24.11.2010 - 20:05) ak167 написал(а):
DySprozin, хотя нет, все работает! Нужно было лишь кодировку на сайте сменить! 
Я даже попытался получить еще и название из этого html-кода. Но получилось вот что:
названиеtarget="_blank"
Использовал вот такую решулярку: #target="_blank">([^<]+)</a>#isU
А вот получить ссылку так и не получилось. Не подскажите как мне это сделать и как получить название без arget="_blank"?

Я даже попытался получить еще и название из этого html-кода. Но получилось вот что:
названиеtarget="_blank"
Использовал вот такую решулярку: #target="_blank">([^<]+)</a>#isU
А вот получить ссылку так и не получилось. Не подскажите как мне это сделать и как получить название без arget="_blank"?
Спустя 1 час, 42 минуты, 2 секунды (24.11.2010 - 21:47) DySprozin написал(а):
;;Но получилось вот что
preg_match или preg_match_all использовали? (;
;;А вот получить ссылку так и не получилось.
что делали/какой результат? (;
preg_match или preg_match_all использовали? (;
;;А вот получить ссылку так и не получилось.
что делали/какой результат? (;
Спустя 23 часа, 26 минут, 49 секунд (25.11.2010 - 21:14) ak167 написал(а):
DySprozin, все названия получал во так:
потом приходилось чистить их вот так:
А вот ссылки получить так и не удалось. Для их получения использовал вот такой код:
preg_match_all( '#target="_blank">([^<]+)</a>#isU', $text , $title );
потом приходилось чистить их вот так:
for ($i=0; $i<=9; $i++)
{
$tit = str_replace( 'target="_blank">', '', $title[0][$i] );
echo $tit;
}
А вот ссылки получить так и не удалось. Для их получения использовал вот такой код:
preg_match_all( '#href"([^href"]+)"#isU><img alt="#isU', $text , $link );
Спустя 2 часа, 37 минут, 17 секунд (25.11.2010 - 23:51) DySprozin написал(а):
;;потом приходилось чистить их вот так:
потому что надо курить мануалы :P
правильно так:
т.е. echo $title[1][$i];
;;preg_match_all( '#href"([^href"]+)"#isU><img alt="#isU', $text , $link );
[^href"] означает: "без _символов_ h, r... итд" тебе оно надо? (; и "равно" после href пропустил (; ну, для первого раза очень даже неплохо, есть куда расти (; в данном же случае все просто до нельзя:
если что непонятно - спрашивай (;
потому что надо курить мануалы :P
правильно так:
for ($i=0; $i<=count($title[1]); $i++){
echo $title[1][$i];
}
т.е. echo $title[1][$i];
;;preg_match_all( '#href"([^href"]+)"#isU><img alt="#isU', $text , $link );
[^href"] означает: "без _символов_ h, r... итд" тебе оно надо? (; и "равно" после href пропустил (; ну, для первого раза очень даже неплохо, есть куда расти (; в данном же случае все просто до нельзя:
preg_match_all( '#href="([^"]+)"#isU', $text , $title );
for ($i=0; $i<count($title[1]); $i++)
{
echo $title[1][$i]."<br>";
}
если что непонятно - спрашивай (;
Спустя 20 часов, 10 минут, 34 секунды (26.11.2010 - 20:02) ak167 написал(а):
DySprozin, мануал я курил!
Но там не все описано.
Например, из вашей регулярки после прочтения мануала мне не все ясно.
Вот например нормально работающщая регулярка опписания:
#</i>([^<]+)</div>#isU
ну знак # в начале и в концые это понятно. Далее </i> это то, по чему осуществляется поиск, тоже ясно.
Далее ([^<], как вы описали выше, значает без символов. В данном случаем без символа "<". Непонятно зачем и главное какое это имеет отношение к этому случаю?
Далее идет плюс и закрывается скобочка. Плюс это как я понимаю плюс еще какие-то сиволы, однако они не указаны в [a-z,0-9]. Почему?
Далее идет </div> и #isU. С этим тоже все понятно.
Буду благодярен, если ответите на мои вопросы.

Например, из вашей регулярки после прочтения мануала мне не все ясно.
Вот например нормально работающщая регулярка опписания:
#</i>([^<]+)</div>#isU
ну знак # в начале и в концые это понятно. Далее </i> это то, по чему осуществляется поиск, тоже ясно.
Далее ([^<], как вы описали выше, значает без символов. В данном случаем без символа "<". Непонятно зачем и главное какое это имеет отношение к этому случаю?
Далее идет плюс и закрывается скобочка. Плюс это как я понимаю плюс еще какие-то сиволы, однако они не указаны в [a-z,0-9]. Почему?
Далее идет </div> и #isU. С этим тоже все понятно.
Буду благодярен, если ответите на мои вопросы.
Спустя 36 минут, 17 секунд (26.11.2010 - 20:38) DySprozin написал(а):
ak167
>Далее ([^<], как вы описали выше, значает без символов.
не-а
это означает: "любой символ, кроме этого"
>Далее идет плюс и закрывается скобочка.
плюс означает >=1 символа. Т.е. имеем:
</i>([^<]+)</div>
означает: "найти и сохранить (сохранение обеспечивают скобки) группу символов между </i> и </div>, причем символы любые, кроме угловой скобки" (;
>какое это имеет отношение к этому случаю?
очень просто: описание по определению не может содержать угловых скобок (для этого есть < >), потому можно этим воспользоваться (;
>Далее ([^<], как вы описали выше, значает без символов.
не-а

>Далее идет плюс и закрывается скобочка.
плюс означает >=1 символа. Т.е. имеем:
</i>([^<]+)</div>
означает: "найти и сохранить (сохранение обеспечивают скобки) группу символов между </i> и </div>, причем символы любые, кроме угловой скобки" (;
>какое это имеет отношение к этому случаю?
очень просто: описание по определению не может содержать угловых скобок (для этого есть < >), потому можно этим воспользоваться (;
Спустя 1 день, 1 час, 25 минут, 20 секунд (27.11.2010 - 22:04) ak167 написал(а):
DySprozin, теперь ясны эти моменты.
Подредактировал с учетом вышеизложенного. Теперь ссылки находяться, однако, всего для 3-х тем вместо 10! Т.е. находятся не все. В чем причина?
И еще вместо чистой ссылки она опять с ненужными примесями!
Нужно так: http://yandex.ru
А она вот так: href="http://yandex.ru"rel="nofollow"target="_blank">
Использую вот эту регулярку:
#href="([^<]+)"><img alt="#isU
Вроде как делаю все правильно по аналогии с той регуляркой, которую ты мне давал ранее для описания (#</i>([^<]+)</div>#isU), однако, описание получаеться чистое без примесей, а ссылка с лишними примесями, которые я испольовал в регулярке, т.е. с href=" и "rel="nofollow"target="_blank">. Почему так?
Особенно удивляет почему из десяти тем парсер извлекает ссылки только из трех.
Подредактировал с учетом вышеизложенного. Теперь ссылки находяться, однако, всего для 3-х тем вместо 10! Т.е. находятся не все. В чем причина?
И еще вместо чистой ссылки она опять с ненужными примесями!
Нужно так: http://yandex.ru
А она вот так: href="http://yandex.ru"rel="nofollow"target="_blank">
Использую вот эту регулярку:
#href="([^<]+)"><img alt="#isU
Вроде как делаю все правильно по аналогии с той регуляркой, которую ты мне давал ранее для описания (#</i>([^<]+)</div>#isU), однако, описание получаеться чистое без примесей, а ссылка с лишними примесями, которые я испольовал в регулярке, т.е. с href=" и "rel="nofollow"target="_blank">. Почему так?
Особенно удивляет почему из десяти тем парсер извлекает ссылки только из трех.
Спустя 3 минуты, 31 секунда (27.11.2010 - 22:07) DySprozin написал(а):
;;всего для 3-х тем вместо 10!
ээ... где 10? (;
ээ... где 10? (;
Спустя 14 часов, 55 минут, 29 секунд (28.11.2010 - 13:03) ak167 написал(а):
DySprozin, в самом первом сообщении этой темы я привел код для 3-х сообщений. На самом деле их 10 и все надо отпарсить=)
Спустя 55 минут, 9 секунд (28.11.2010 - 13:58) DySprozin написал(а):
ak167
Цитата |
Использую вот эту регулярку: #href="([^<]+)"><img alt="#isU |
ну потому что ты не хочешь вникнуть :(
последняя подсказка: надо
#href="([^"]+)"><img alt="#isU
тогда мусора не будет (;
;;мануал я курил!
ну а ты думаешь, что я узнал от тайного общества программистов?))) в мануалах все есть, просто читать их надо вдумчиво, перед сном, а можно вместо сна :D
кидай в личку свой текст, будет время - напишу для него шаблон...