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

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

  • web-bee

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

    Spritz Май 19, 2010, 1: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*" } ..

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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


    не тестил на любой, но те которые ему скармливаю - он обрабатывает на ура
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

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

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

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

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

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


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

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

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

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

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

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


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


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


    это вы прочитали?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • web-bee

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

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

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

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

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

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

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

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

    Spritz Май 19, 2010, 2: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

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

    Spritz Май 19, 2010, 3: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

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

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

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

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