Помощь в составлении регулярного выражения для граббера!

Тема в разделе "Регулярные выражения", создана пользователем Acidrayne, 4 мар 2010.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    Здраствуйте задался целью написать граббер одного популярного сайта, но в итоге понял что ничего не смыслю в регулярных выражениях..... И для меня одного эта задача пока не осущствима!
    Тоесть это смарт версия основного сайта, я выбрал ее потому что грабить с нее проще , потому что отсутствуют элементы дизайна!
    Написал авторизацию на curl но потом встал в тупик, помогите мне пожалуйста распарсить ключевые моменты этой страницы !!! Такие как название, описание, категория, ну и ссылка на сам файл и скриншот, чтобы их можно было скачать!
    Мне вот помогли с регуляркой, но она по неизвестным мне причинам не хочет работать:
    Код:
    #название и ссылка  
    preg_match("|<div id='plus-\d*'></div><hr><br><b><a\s*href='([^']*)'>(.*?)</a></b>|is", $html, $url);  
    #категория  
    preg_match("|<br>Категория:[\s]*<a href='[^']*'>(.*?)</a>|is", $html, $cat);  
    #скриншот  
    preg_match("|[<a href='([^']*)'>скриншот</a>\]|is", $html, $scr);  
    #описание  
    preg_match("|2010,(.*?)\[|is", $html, $discr);  
    echo "$url $cat"; 
    echo "$discr"; 
    echo "$scr"; 
    выдается ошибка:
    Исходны йкод страницы находится ниже, Зараннеее благодарен с уважением...
     
  2. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Код:
    |[<a href='([^']*) => |[<a href='([^']*)[B]|[/B]
    "|2010,(.*?)\[|is" => '|2010,(.*?)\[|is'
    
     
  3. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    Сорри не могли бы вы более подробно описать суть ?

    пишет ошибку:
    делал так:

    Код:
    preg_match("|[<a href='([^']*) => |[<a href='([^']*)|"|2010,(.*?)\[|is" => '|2010,(.*?)\[|is'", $html, $cat);
    
     
  4. mydooms

    mydooms Постоялец

    Регистр.:
    22 фев 2008
    Сообщения:
    105
    Симпатии:
    26
    имелось ввиду заменить одну часть строки на другую

     
  5. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    блин я уже совсем замучался с ними, вы не поверите но выдает опять такую же ошибку:

    в этом коде:

    Код:
    preg_match("|[<a href='([^']*)|is", $html, $scr); 
    echo "$scr"; 
    preg_match('|2010,(.*?)\[|is', $html, $discr);
    echo "$discr"; 
    В $html данные попадают корректно, проверялось echo $html; перед выводом регулярок!
     
  6. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Запутался
    Код:
    "|[<a href='([^']*)'>скриншот</a>\]|is" 
    заменить на
    "|\[<a href='([^']*)'>скриншот</a>\]|is"
    
    PHP:
    preg_match("|[<a href='([^']*)|is"$html$scr); 
    echo 
    "$scr"
    preg_match('|2010,(.*?)\[|is'$html$discr);
    echo 
    "$discr";
    Код:
    arning: preg_match() [function.preg-match]: Compilation failed: unmatched parentheses at offset 16 in E:\webserver\www\curl\curl.php on line 34
    Warning: preg_match() [function.preg-match]: Compilation failed: unmatched parentheses at offset 16 in E:\webserver\www\curl\curl.php on line 36
    Array Array 
    
    У меня одна ошибка, и само собой на первой строке, а не 34 и 36

    Суть в том что автор не экранировал символ [.
     
    Acidrayne нравится это.
  7. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    делаю так:
    PHP:
    preg_match("|\[<a href='([^']*)'>скриншот</a>\]|is"$html$scr); 
    print_r ($scr);
    результат array() и все больше ничего нет :(

    когда делаю echo $scr[0]; - то вообще пустой экран
     
  8. luckydark

    luckydark Создатель

    Регистр.:
    27 ноя 2008
    Сообщения:
    26
    Симпатии:
    5
    я хз, что там ссылка на сам файл, если то, во что заключено само название, то как-то так:
    PHP:
    $pattern "/<br><b><a  href='(.+)'>(.+)<.*<a href='(.+)'>скриншот.*категория: <a href='(.+)'>(.+)<.*<br><div.*>(.+)</Umis";
    if (!
    preg_match_all($pattern$content$parts)) {
        die(
    "Couldn't parse content\n");
    }

    array_shift($parts);
    здесь, $parts[0] - массив относительных ссылок на файл, $parts[1] - названия, $parts[2] - ссылки на скрин, $parts[3] - относительные ссылки на категории (тебе потом нужно строить дерево по ним), $parts[4] - название категорий, $parts[5] - описание.

    паттерн длинный, но лучше по производительности использовать именно такой вариант.

    зы: регулярка именно для твоего случая, сырец которого был в аттаче, если, скажем УРЛы в анкорах не в одинарных кавычках. то ессно нужно перерписывать
     
    Acidrayne нравится это.
  9. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    Я уже не знаю чт ои делать, наверное это заколдованное занятие :)

    Перепробывал все значения $parts от 1-4 всегда на экране выводится только
    может что-то не правльно делаю ??
     
  10. luckydark

    luckydark Создатель

    Регистр.:
    27 ноя 2008
    Сообщения:
    26
    Симпатии:
    5
    ээ, вместо echo $parts[5]; print_r($parts[5]) ;)
    только зачем тебе их принтить? какова конечная цель всего этого - составить базу?

    в общем, в массиве $parts (при успешном парсинге, если не изменился шаблон) бедет 6 массивов:
    $parts[0] - массив относительных ссылок на файл, $parts[1] - названия, $parts[2] - ссылки на скрин, $parts[3] - относительные ссылки на категории (тебе потом нужно строить дерево по ним), $parts[4] - название категорий, $parts[5] - описание.

    зы: парсинг чужого контента - зло )
     
    Acidrayne нравится это.
Статус темы:
Закрыта.