preg_match странная особенность или баг?

Тема в разделе "PHP", создана пользователем trooll, 12 фев 2011.

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

    trooll PHP кодер

    Регистр.:
    22 дек 2008
    Сообщения:
    503
    Симпатии:
    116
    PHP:
    $data '<li><a href="search.php?q=%ED%EE%F3%F2%E1%F3%EA+dns" style="color:red">Ноутбуки DNS</a></li>';

    preg_match('#<a href="(.+)">#iU'$data$match_rezult);
    unset(
    $match_rezult[0]);

    echo 
    $match_rezult[1];
    Выводит:
    search.php?q=%ED%EE%F3%F2%E1%F3%EA+dns" style="color:red

    Не пойму почему выводит именно то, когда должно выводить:
    search.php?q=%ED%EE%F3%F2%E1%F3%EA+dns

    У кого какие соображения?

    =-=-=-=-=-=-=-=-=-=-=-=-=
    Добавил решение:
    Тфу ты твою мать, не правильно регулярку составил.

    Правильная регулярка:
    PHP:
    preg_match('#<a href="(.+)"#iU'$data$match_rezult);
    P.S.: Модераторы можете удалить тему или же оставить как наглядное пособие для начинающих PHP кодеров.
     
  2. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Особенность работы регулярных выражений. Он пытается захватить как можно большее совпадение. > в конце заставляет захватить до последних кавычек, даже если поставить .+?

    надо так
    '/<a href="(.+?)"/'
     
  3. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    По учёному это называется жадностью и тут она не причём- параметр U - убирает жадность у всех квантификаторов в выражении.
     
  4. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    KillDead

    Признаю, что ошибся. Просто поиск идет не до "первой найденной кавычки", а "первой найденной кавычки, после которой идет >".
     
Статус темы:
Закрыта.