странная жадность...

Тема в разделе "Регулярные выражения", создана пользователем black.cat, 10 май 2009.

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

    black.cat

    Регистр.:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    32
    имееццо php5
    PHP:
    preg_match_all("@(<form.*?name=commentform.*?</form>)@is"$src$forms );
    но он не находит нужную форму с именем commentform
    вся проблема в первом .*? если его заменить на совсем нежадный .? то все находит.
    Такое общущение что .*? нежадное можно применить один раз. Но так же небывает...
    Применял модификатор U - не помогло...

    В результате находит один большой кусок начиная с первой <form> и заканчуя самой последней </form> в html коде

    Подопытная строка:
    HTML:
    <FORM method=post name=commentform action=index.php> пиво </FORM>
    П.С. задача тривиальная - быстро выдрать форму с определенным именем и экшном...
     
  2. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Либо это баг PHP, либо ты еще что-то пропустил.
    Денвервоский PHP 5.24
    PHP:
    <?php
    $src
    ="<FORM method=post name=commentform action=index.php> пиво </FORM>";
    preg_match_all("@(<form.*?name=commentform.*?</form>)@is"$src$forms );  
    print_r($forms);
    Вывод
    Код:
    Array
    (
        [0] => Array
            (
                [0] => <FORM method=post name=commentform action=index.php> пиво </FORM>
            )
    
        [1] => Array
            (
                [0] => <FORM method=post name=commentform action=index.php> пиво </FORM>
            )
    
    )
    
    З.Ы. .? жадный модификатор.
     
  3. black.cat

    black.cat

    Регистр.:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    32
    хм...
    а вот этот код:
    HTML:
    123<FORM method=post name=not_beer action=index.php> wodka </FORM>123<FORM method=post name=commentform action=index.php> пиво </FORM>123
    регекспом
    PHP:
    "@(<form.*?name=commentform.*?</form>)@is"
    парсится неверно:
    HTML:
    Array
    (
        [0] => Array
            (
                [0] => <FORM method=post name=not_beer action=index.php> wodka </FORM>123<FORM method=post name=commentform action=index.php> пиво </FORM>
            )
    
        [1] => Array
            (
                [0] => <FORM method=post name=not_beer action=index.php> wodka </FORM>123<FORM method=post name=commentform action=index.php> пиво </FORM>
            )
    
    )
    т.е. если целевая форма не первая - он результует с первого <form> по последний </form>

    пробовал на разных несборочных php 5.2.5/fedora9, 5.2.8/win32
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Ну естесно. Показываю наглядно, кусок регулярки - кусок текста.
    <form - 123[<FORM] method=post ...
    .*? - <FORM[ method=post name=not_beer action=index.php> wodka </FORM>123<FORM method=post ]name=commentform ...
    name=commentform - ... method=post [name=commentform] action=index.php ...
    .*?</form> - ... name=commentform[ action=index.php> пиво </FORM>]123
     
  5. black.cat

    black.cat

    Регистр.:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    32
    хм. так а шо делать?
    как выдрать форму если она не одна ?
     
  6. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    {<form[^>]+name=commentform\b.*?</form>}si
     
    black.cat нравится это.
  7. black.cat

    black.cat

    Регистр.:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    32
    Работает :) Но логики непонимаю...

    регексп начинается с "<form[^>]+"
    это вродебы означает взять все начаиная с "<form" и заканчивая ">"
    а как же поле name=commentform ? оно же какраз внутри <form >
    но почемуто в выражении идет после закрывающего [^>]+
     
  8. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    <form так и означает <form. [^>] означает лбюбой символ кроме >. + Означает что это подвыражение совпадает от одного до бесконечности раз. Т.е. за <form идет как минимум один символ, не являющийся >.
     
Статус темы:
Закрыта.