[Регулярки & Mod_Rewrite] Задай вопрос, получи ответ.

Discussion in 'PHP' started by .:EnoT:., 19 Nov 2008.

Thread Status:
Not open for further replies.
  1. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Неужели так тяжело включить мозги и дать ВСЮ страницу и сказать какой именно момент нужно отпарсить, чтоб не растягивать на несколько страниц вытягивая с тебя по одному слову что тебе нужно.
     
  2. programming

    programming New Member

    Joined:
    26 Aug 2009
    Messages:
    190
    Likes Received:
    3
    Reputations:
    0
    Спасибо. Ссылки достаются, а как достать названия стран?
    Туго у меня идут эти регэкспы.. никак не могу разобраться..
    Вот ещё вопрос: почему в preg_match_all ('/<a href="(\d+\/)">(.+?)<\/a>/', $str, $m); выдирается именно ссылка, а не название?

    И рег выражения могут выдирать русские буквы?
     
    #782 programming, 30 Nov 2009
    Last edited: 30 Nov 2009
  3. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Выдирается тут все, разберем регулярку:
    PHP:
    preg_match_all ('/<a href="(\d+\/)">(.+?)<\/a>/'$str$m);
    В $m[0] будут находится все ссылки с HTML тегами, в $m[1]; будут находится первые вхождения заключенные в фигурные скобки, тоесть все что подходит под (\d+\/) в нашем выражении, ну и в $m[2]; будет все что попадает под (.+?)
    Вообщем после регулярки напиши print_r($m); и сам все увидиш.
    Есесно '#[а-я]#i'
     
    1 person likes this.
  4. programming

    programming New Member

    Joined:
    26 Aug 2009
    Messages:
    190
    Likes Received:
    3
    Reputations:
    0
    Спасибо.
    Вот ещё проблема..
    С http://www.ozon.travel/countries/16644/ нужно выдернуть код страны. Как составить рег выражение?
    Составлял так:
    PHP:
    preg_match_all('/Код страны:<\/strong>(.*)<\/p>/',$out1$regs1);
     
  5. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    programming
    По идее, как ты составил должен выплевывать тебе символ новой строки + 3 табуляции.
    Там довольно редко стречается табуляция так что можно зацепиться за нее (Вообще можно просто искать по маске \+\d+ но не факт, что на странице не будет чего-то вроде +0, что не является кодом страны). Так что получается что-то вроде:
    Code:
    \t\t\t(\+\d+)</p>
     
    1 person likes this.
  6. programming

    programming New Member

    Joined:
    26 Aug 2009
    Messages:
    190
    Likes Received:
    3
    Reputations:
    0
    Спасибо. Разобрался как выдергивать такие вещи.
    Появилась ещё большая проблема. Есть допустим http://www.ozon.travel/countries/1727/ и http://www.ozon.travel/countries/6675/ , а также остальные страны с http://www.ozon.travel/countries/.
    Каким образом возможно выдернуть описание с этих страниц? То есть, чтобы шаблон рег выражения подходил ко всем страницам стран. Выдернуть нужно только основное описание, то есть перелёты и т.д. не нужно..
    Возможно ли такое осуществить?
     
  7. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    programming
    По регулярке собираешь id всех страниц, затем перебирая их открываешь страницу http://www.ozon.travel/countries/{{ id }}/ и выдергиваешь оттуда описание.

    Id стран можно искать на странице http://www.ozon.travel/countries/ по регулярке:
    Code:
    <li><a href="(\d+)/">
    Дальше уже ищешь полное описание и записываешь, допустим, для каждой страны в свой файл.
     
  8. programming

    programming New Member

    Joined:
    26 Aug 2009
    Messages:
    190
    Likes Received:
    3
    Reputations:
    0
    Это всё само собой понятно. Проблема вытащить само описание, а точнее составить регулярку, которая подходила бы ко всем странам.
     
  9. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    Ну смотри в исходнике страницы за что можно зацепиться. Перед самим контентом можно зацепиться за класс breadcrumb, после контента за класс футера.
     
  10. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    PHP:
    <?php
    ini_set
    ('max_execution_time','0');


    get_countries_info('http://www.ozon.travel/countries/1727/');


    function 
    get_countries_info($url)
    {
        
    $fp file_get_contents($url);
        if(
    preg_match_all('#<p><strong>(.*): </strong>(.*)</p>#U'$fp$m))
        {
            foreach (
    $m[0] as $str) {
                echo 
    strip_tags($str).'<br>';
            }
        }
        
        if(
    preg_match_all('#</p><p><b>(.*)</b>(.*?)</p><h1>#'$fp$m))
        echo 
    strip_tags($m[0][0]);

    }

    ?>
    Выводит:
    ЗЫ Функция выводит все в UTF-8 поетому если будеш использовать повставляй iconv() в нужных местах.
     
  11. programming

    programming New Member

    Joined:
    26 Aug 2009
    Messages:
    190
    Likes Received:
    3
    Reputations:
    0
    Всё-таки то, что хочу я, наверное, невозможно реализовать..
    В случае с Данией действительно вырывается всё отлично.
    #</p><p><b>(.*)</b>(.*?)</p><h1># но что если в описании страны нет жирного шрифта?? В некоторых случаях он вообще не выдёргивает, в некоторых выдёргивает один абзац из нескольких, в котором есть жирный шрифт.
    В общем бред с этой задачей..
     
  12. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Как я заметил на всех страницах стиль оформления один, кинь мне несколько УРЛов где оформления разные, позже гляну.
     
  13. programming

    programming New Member

    Joined:
    26 Aug 2009
    Messages:
    190
    Likes Received:
    3
    Reputations:
    0
    http://www.ozon.travel/countries/590/
    http://www.ozon.travel/countries/605/
     
  14. programming

    programming New Member

    Joined:
    26 Aug 2009
    Messages:
    190
    Likes Received:
    3
    Reputations:
    0
    В общем не могу придумать что делать с выдиранием описания..
    А что если вырвать полное описание, а не первые абзацы? Например, на http://www.ozon.travel/countries/1032/ с Чем заняться путешественнику в Венгрии? Подлечиться-оздоровиться на термальных курортах, оценить далеко не бедную местную историческую «экскурсионку», а и до самого конца. Какую регулярку тогда составить?

    Проблему уже сам решил.
     
    #794 programming, 2 Dec 2009
    Last edited: 2 Dec 2009
  15. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    155
    Likes Received:
    6
    Reputations:
    0
    имеется html код
    Code:
    <p><h1>Заголовок</h1></p>
    <p>описание</p>
    <p>
    нужно выдрать заголовок и описание! Делаю вот так
    Code:
    '</h1></p><p>(.*?)<\/p><p>';
    нифига не работает! делаю в делфи
     
  16. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    SultanOFF
    Можешь выдирать отдельно или одной регуляркой.

    По отдельности:
    Code:
    Заголовок - '<h1>(.*?)</h1>'
    Описание - '</h1></p>\n<p>(.*?)</p>'
    У тебя в регулярке для описания не хватает символа новой строки (eol).
    Если одной регуляркой, то:
    Code:
    '<h1>(.*?)</h1></p>\n<p>(.*?)</p>'
     
  17. SultanOFF

    SultanOFF Member

    Joined:
    4 Jun 2009
    Messages:
    155
    Likes Received:
    6
    Reputations:
    0
    спасибо, теперь работает :)
     
  18. programming

    programming New Member

    Joined:
    26 Aug 2009
    Messages:
    190
    Likes Received:
    3
    Reputations:
    0
    Есть переменная. В ней html код. Нужно выдрать из него все ссылки. Но текст ссылки оставить.
    Как такое реализовать?
     
  19. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Вопрос не ясен, как ето "выдрать", если нужны только ссылки, тоесть то что находится в href='' то вот регулярка
    Или тебе нужно preg_replace сделать, и удалить все что в href но оставив <a>ссылку</a> ?
     
  20. programming

    programming New Member

    Joined:
    26 Aug 2009
    Messages:
    190
    Likes Received:
    3
    Reputations:
    0
    Нужно просто убрать тег:
    было: <a href="ссылка">Текст</a>
    стало: Текст
     
Thread Status:
Not open for further replies.