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

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

  • web-bee

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

    Spritz 19 мая 2010 г. 2: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*" } ..

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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


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

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

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

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

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

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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

    текст
    <input name=&quot;userID&quot; type=&quot;hidden&quot; value=&quot;492&quot; />

    результат

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

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

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

    )


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

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

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


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

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


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

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

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

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

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