Отпарсить динамические значения формы

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

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

    HalliK Постоялец

    Регистр.:
    4 фев 2007
    Сообщения:
    117
    Симпатии:
    166
    В форме присутствует много input'ов, где связки параметр=значение плавающие, т.е. меняютсвое положение в описании input'а:
    1)<input type="hidden" name="hash" value="значение" />
    2)<input value="значение" type="hidden" name="hash" />
    3)<input type="hidden" value="значение" name="hash" />
    и т.д.
    Какой регуляркой вытянуть значения name и value?
     
  2. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Код:
    <input\b
    (?=[^>]+?\bname="([^"]*)")
    (?=[^>]+?\bvalue="([^"]*)")
    
     
    HalliK нравится это.
  3. HalliK

    HalliK Постоялец

    Регистр.:
    4 фев 2007
    Сообщения:
    117
    Симпатии:
    166
    Спасибо огромное! Помогло, если несложно объясни что тут что обозначает? Запутался, от мануалов уже голова пухнет :)
     
  4. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    (?= ... ) - Опережающая проверка. Все, что внутри действует как и обычная регулярка, но не включается в совпадение. Т.е. по выходе из скобок, дальнейший поиск продолжается с того же места.
    [^>]- совпадение с любым символом, кроме '>'
    +? - модификатор, означающий что [^>] повторяется от одного и более раз.
    Этот модификатор не жадного типа (знак ? в нем), т.е. он старается захватить как можно меньше символов, в противоположность жадному модификатору +, который захватыват по максим ому.
    [^"]* модификатор * означает ноль или более раз, модификатор жадный.
    ( ) - сохраняющие скобки, для сохранения значений
    \b означает границу слова, поставлен на всякий случай, по привычке. Если бы допустим мы искали тег <i>, то без символа \b выражение /<i/ также совпало с <input, и другими тегами на i.
     
    La5erWind и HalliK нравится это.
  5. rex1963

    rex1963

    Регистр.:
    19 фев 2007
    Сообщения:
    228
    Симпатии:
    47
    Если можно, полностью паттерн для данного примера

    Сделал Вот таким образом
    PHP:
    $pattern '|<input\b (?=[^>]+?\b name="([^"]*)")(?=[^>]+?\b value="([^"]*)")|is'
    preg_match_all($pattern$content$array); 
    echo 
    "Значения"
    echo 
    "<pre>"
    print_r($array[2]); 
    echo 
    "</pre>";  
    }
    выдает пустой массив:nezn:

    И еще один вопрос, если парсить форму, можно ли выдергивать
    action и input одной регуляркой?
     
  6. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    rex1963
    У тебя в регулярке есть дополнительные пробелы, поэтому надо либо их удалить, либо использовать регулярку с модификатором x.
    Код:
    |<input\b (?=[^>]+?\b name="([^"]*)")(?=[^>]+?\b value="([^"]*)")|ix
    
    Смотря что имеется ввиду
     
  7. rex1963

    rex1963

    Регистр.:
    19 фев 2007
    Сообщения:
    228
    Симпатии:
    47
    Пример
    PHP:
    <?
    //гружу страницу с формой
    $content=file_get_contents("http://eee/com");
    //вытаскиваю action
    preg_match_all('~<form.+action\s?=\s?(\'|"|)([^\s>]+)\1(\s|>)[^>]*~Ui'$content$m);
    echo 
    "Значения"
    echo 
    "<pre>"
    print_r($m[2]); 
    echo 
    "</pre>"
    //затем тащу поля
    $pattern '|<input\b (?=[^>]+?\b name="([^"]*)")(?=[^>]+?\b value="([^"]*)")|ix'
    preg_match_all($pattern$contents$array); 
    echo 
    "Значения"
    echo 
    "<pre>"
    print_r($array[2]); 
    echo 
    "</pre>";  
    }
    ?>
    Как все это сделать одним выражением и раскидать в массив:
    form- action=>value
    input- name=>value
    textarea - name=>value

    Вообще при парсинге формы как следует поступать
    например, поля input- name без value, их отдельно надо описывать регуляркой или как?
    Типа:
    1 выражение тянет action=>value из формы
    2 выражение input- name без value
    3 выражение input- name=>value
    4 выражение textarea - name=>value

    Или можно все собрать в один паттерн?
     
    L_D нравится это.
  8. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Не очень понял зачем, но собрать в один паттерн можно. Примерно так
    Код:
    (?six)
    (?:
    <form\b[^>]+?\baction\s*=\s*(?:"(?<action>[^"]*)"|'(?<action>[^']*)'|(?<action>[^\s'"<>]+))
    |
    <input\b
    (?=[^>]+?\bname="(?<name>[^"]*)")
    (?:[^>]+?\bvalue="(?<value>[^"]*)")?
    |
    <textarea\b[^>]+?name\s*=\s*"(?<name>[^"]*)"[^"]*>(?<value>.*?)</textarea\s*>
    )
    
     
    L_D и rex1963 нравится это.
  9. L_D

    L_D Создатель

    Регистр.:
    20 авг 2007
    Сообщения:
    37
    Симпатии:
    3
    Здравствуйте, для подобной цели мне подошел паттерн
    PHP:
    $pattern '|<input\b (?=[^>]+?\b name\=\"(.*)\")(?=[^>]+?\b value="([^"]*)")|Uix';
    Но у некоторых целевых инпутов отсутствуют value. При этом name у таких тоже теряется. Как бы подправить, чтобы - если нет value, записывать name и оставлять значение value для него пустым?
     
  10. Qwest-fx

    Qwest-fx Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    129
    Симпатии:
    39
    Не пробовали искать готовые решения для парсинга форм, я имею у себя целый класс.
     
    L_D нравится это.
Статус темы:
Закрыта.