ФорумПрограммированиеPHP для идиотов → Вырезание регулярками значений hidden-полей

Вырезание регулярками значений hidden-полей

  • web-bee

    Сообщения: 119 Репутация: N Группа: Кто попало

    Spritz 19 мая 2010 г. 5:28

    Задача такая: из полученной $content - html-страницы, где около 20 вот такого вида конструкций
    <input type="hidden" name="ru" id="ru" value="">
    извлечь значения name и value.
    Думала извлекать их как содержимое карманов..

    Вот мой код:

    preg_match_all('| (type="hidden"\s name="(.*?)"\s (.*?)\s value="(.*?)") |x',
    $content,
    $t_matches,
    PREG_SET_ORDER
    );
    //смотри что вышло:
    var_dump($t_matches);


    у меня в результате такой вот корявый наворот массивов получается:

    array(21) { [0]=> array(5) { [0]=> string(116) "type="hidden" name="MfcISAPICommand" value="SignInWelcome"> string(116) "type="hidden" name="MfcISAPICommand" value="SignInWelcome"> string(15) "MfcISAPICommand" [3]=> string(64) "value="SignInWelcome"> string(6) "DEF_CI" } [1]=> array(5) { [0]=> string(108) "type="hidden" name="UsingSSL" value="1"> string(108) "type="hidden" name="UsingSSL" value="1"> string(8) "UsingSSL" [3]=> string(68) "value="1"> string(1) "2" } [2]=> array(5) { [0]=> string(47) "type="hidden" name="lse" id="lse" value="false"" [1]=> string(47) "type="hidden" name="lse" id="lse" value="false"" [2]=> string(3) "lse" [3]=> string(8) "id="lse"" [4]=> string(5) "false" } [3]=> array(5) { [0]=> string(42) "type="hidden" name="lsv" id="lsv" value=""" [1]=> string(42) "type="hidden" name="lsv" id="lsv" value=""" [2]=> string(3) "lsv" [3]=> string(8) "id="lsv"" [4]=> string(0) "" } [4]=> array(5) { [0]=> string(130) "type="hidden" name="mid" id="mid" value="AQAAASiEqSo+AAUxMjhhZmQwMTM1Yy5hMDI2NjJiLjczNTU3LmZmZmUyM2I1Fo+LsYaeiU6sshZqZrQj5FYlvNo*"" [1]=> string(130) "type="hidden" name="mid" id="mid" value="AQAAASiEqSo+AAUxMjhhZmQwMTM1Yy5hMDI2NjJiLjczNTU3LmZmZmUyM2I1Fo+LsYaeiU6sshZqZrQj5FYlvNo*"" [2]=> string(3) "mid" [3]=> string(8) "id="mid"" [4]=> string(88) "AQAAASiEqSo+AAUxMjhhZmQwMTM1Yy5hMDI2NjJiLjczNTU3LmZmZmUyM2I1Fo+LsYaeiU6sshZqZrQj5FYlvNo*" } ..

    я так понимаю, что у меня регулярка неправильная..
    подскажите как решить такую задачу?
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 19 мая 2010 г. 5:32, спустя 3 минуты 46 секунд

    может быть нахуй регулярки и попробовать это через DOM распарсить?
    Спустя 58 сек.
    если сложно на чистом DOM'е, который в пыхе - попробуй phpQuery
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 19 мая 2010 г. 5:44, спустя 12 минут 3 секунды


    '|type="hidden".*?name="(?<name>.*?)".*?value="(?<value>.*?)"|x'
    Спустя 91 сек.
    тут проблема в том, что type/name/value могут идти не в том порядке, поэтому надо сначала искать поля с type="hidden", после чего распарсивать эти поля и вытаскивать из них name/value
    Спустя 51 сек.
    Но вообще и в правду можно заюзать phpQuery (мы его юзаем для парсинга торрентов для кинсбурга) либо simplexml
    adw/0
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 19 мая 2010 г. 5:50, спустя 6 минут 11 секунд

    Какой simplexml? Где гарантия, что страница содержит валидный XHTML?
    Насчет phpQuery не знаю … оно любой говнокод прожует?
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 19 мая 2010 г. 5:55, спустя 4 минуты 53 секунды

    я не знаю точно, но вроде бы страница не обязательно должна быть валидной а быть просто well-formed
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 19 мая 2010 г. 5:57, спустя 2 минуты 13 секунд


    Насчет phpQuery не знаю … оно любой говнокод прожует?


    не тестил на любой, но те которые ему скармливаю - он обрабатывает на ура
    adw/0
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 19 мая 2010 г. 6:07, спустя 10 минут 4 секунды

    она же на DOM'е, а пожиратель дома в пхп вроде неплохо гавно жрет, так что любая наверное)
    Сапожник без сапог
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 19 мая 2010 г. 6:14, спустя 6 минут 32 секунды


    а быть просто well-formed
    Такой гарантии тоже нет …
  • web-bee

    Сообщения: 119 Репутация: N Группа: Кто попало

    Spritz 19 мая 2010 г. 6:16, спустя 2 минуты 30 секунд

    а почему не через регулярки?
    ну, давайте упростим задачу, нужно только value из хидденов ..
    а нэймы я тогда уже ручками-ручками ))
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 19 мая 2010 г. 6:30, спустя 14 минут 1 секунду


    а почему не через регулярки?
    ну, давайте упростим задачу, нужно только value из хидденов ..
    а нэймы я тогда уже ручками-ручками ))


    тут проблема в том, что type/name/value могут идти не в том порядке, поэтому надо сначала искать поля с type="hidden", после чего распарсивать эти поля и вытаскивать из них name/value


    это вы прочитали?
    adw/0
  • web-bee

    Сообщения: 119 Репутация: N Группа: Кто попало

    Spritz 19 мая 2010 г. 6:40, спустя 10 минут 8 секунд

    да, прочитала.. а почему нельзя повырезать все конструкции с хидденнами, а потом из них уже поизвлекать name/value?
    конечно я посмотрю phpQuery, просто очень хочется решить задачу быстрее (но конечно, без потери в качестве)..
    спасиб.
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 19 мая 2010 г. 6:43, спустя 3 минуты 6 секунд

    я бы сделал так (если регулярками) - в несколько этапов. наверное очень неоптимально, но надежно

    1. добыл бы собственно все инпуты
    /<input.+>/U
    2. только для тех строк, у кого встречается подстрока value="hidden" обработал бы
    /((?:value|name)=".*")/U
    3. пил бы пиво
    Спустя 49 сек.
    вобщем-то эдво описал почему так сложно )))
    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 19 мая 2010 г. 6:50, спустя 6 минут 26 секунд

    http://pyha.ru/fishki/regexp/

    паттерн
    /(value|type|name)="(.*)"/U

    текст
    <input name="userID" type="hidden" value="492" />

    результат

    Array
    (
    [0] => Array
    (
    [0] => name="userID"
    [1] => type="hidden"
    [2] => value="492"
    )

    [1] => Array
    (
    [0] => name
    [1] => type
    [2] => value
    )

    [2] => Array
    (
    [0] => userID
    [1] => hidden
    [2] => 492
    )

    )


    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 19 мая 2010 г. 7:04, спустя 13 минут 41 секунду


    <?php
    error_reporting(-1);
    header('Content-type: text/plain; charset=utf-8');

    $text = file_get_contents('./example1.html');
    if (preg_match_all('/<input.+>/U', $text, $matches, PREG_PATTERN_ORDER)) {
    $inputs = $matches[0];
    foreach ($inputs as $input) {
    if (preg_match_all('/(value|type|name)="(.*)"/U', $input, $matches, PREG_PATTERN_ORDER)) {
    $attribs = array_combine($matches[1], $matches[2]);
    if (isset($attribs['type']) && $attribs['type'] == 'hidden') {
    echo $attribs['name'] . ' = ' . $attribs['value'] . "\n";
    }
    }
    }
    }


    работает )))
    вот эту строчку я просто полюбил: [tt]$attribs = array_combine($matches[1], $matches[2]);[/tt]
    ιιlllιlllι унц-унц
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 19 мая 2010 г. 7:32, спустя 28 минут 22 секунды

    artoodetoo, можно и без array_combine, если в регулярке явно указать именованные ключи:
    (?<key_name>.*?)
    Спустя 23 сек.
    но вообще твой вариант симпатичнее мне
    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!