отловить тэг с прозвольным порядком атрибутов

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

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

    black.cat

    Регистр.:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    32
    есть :
    <input type='hidden' name='user_hash' value='85bec053b0440c05bd44271a46c39fcb' />
    иногда бывает
    <input name='user_hash' type='hidden' value='85bec053b0440c05bd44271a46c39fcb' />
    или
    <input value='85bec053b0440c05bd44271a46c39fcb' name='user_hash' type='hidden' />

    видим что порядок аттрибутов всеремя пляшет...

    как выловить value='(\w+)' чтобы точно знать что я выдрал его с тэга инпут с атрибами нэйм и тайп ?
     
  2. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    311
    на PHP(если я правильно понял задачу:(
    PHP:
    <?php
    $str
    =<<<End_of
    <input name='user_hash' type='hidden' value='85bec053b0440c05bd44271a46c39fcb' />
    <input type='hidden' name='user_hash' value='85bec053b0440c05bd44271a46c39fcb' />
    <input value='85bec053b0440c05bd44271a46c39fcb' name='user_hash' type='hidden' />
    End_of;
    preg_match_all("/<input[ ]+(type='[^']+'|name='[^']+'|value='[^']+')[ ]+(type='[^']+'|name='[^']+'|value='[^']+')[ ]+(type='[^']+'|name='[^']+'|value='[^']+')[ ]+\/>/",$str,$matches);
    foreach(
    $matches as $match){
      foreach(
    $match as $ma){
        if(
    substr($ma,0,5)=="value"){
          echo 
    $ma."\r\n";
        }
      }
    }
    ?>
     
  3. Murdok

    Murdok

    Регистр.:
    1 окт 2006
    Сообщения:
    236
    Симпатии:
    84
    class pars_xml {

    var $parser = null;
    var $attrib = null;

    function pars_xml($tag_str){

    $this->parser = xml_parser_create();
    xml_set_object($this->parser, &$this);
    xml_set_element_handler($this->parser,"opening","closing");
    xml_parse($this->parser,$tag_str);
    }
    function opening($xml_pars,$tag_name,$attrib){
    $this->attrib = $attrib;
    }
    function closing($xml_pars,$tag_name){

    }
    }

    $parser = new pars_xml("<input type='hidden' name='user_hash' value='85bec053b0440c05bd44271a46c39fcb' />");
    echo '<hr>'.$parser->attrib['VALUE'];
     
  4. Igor123

    Igor123 Постоялец

    Регистр.:
    14 июн 2008
    Сообщения:
    116
    Симпатии:
    13
    алгоритм простой

    загоняй в массив выборку по <input type='hidden' name='user_hash' value='85bec053b0440c05bd44271a46c39fcb' />

    далее пробегайся по этому свежему массиву и сверяй есть ли тип хиден и нейм, если есть - то дергай валуе.

    хотя в массив загонять не обязательно - можно на лету проверять, но так тебе будет нагляднее
     
  5. black.cat

    black.cat

    Регистр.:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    32
    сделал помоему проще:
    PHP:
    function get_hidden($html) {
      
    $hdn=false;
      
    $nm=false;
      
    $ret="";
    // выдрать форму
      
    preg_match_all("/(<form[^>]+name=['\"]?inputform['\"]?.*<\/form>)/isU"$html$formsPREG_SET_ORDER );
      if (
    count($forms)>0) {
        foreach (
    $forms as $form) {
          if (
    preg_match("/<input([^>]+)name=[\"']?user_hash[\"']?([^>]*)/isu"$html$match)) {
          
    //склеиваем найденное вокруг нужного тега
          
    $around=$match[1].$match[2];.

          
    // и ищем опять окружающие теги (в моем случае их всего два - я не заморачивался на универсальности)
          
    if (preg_match("/value=[\"']?(\w+)[\"']?/isu"$around$m)) {
            
    $hdn=true;
            
    $ret=$m[1];
          }
          if (
    preg_match("/type=[\"']?hidden[\"']?/isu"$around$m)) {
            
    $nm=true;
          } else {
    $ret="";}
        }
      }
    }
    return 
    $ret;
    }

    А хотелось решить все одной строкой :((
     
  6. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    Вот
    Код:
    {
    <input\b
      (?=[^>]+\btype\s*=\s*(?:'hidden'|"hidden"|hidden\b))
      (?=[^>]+\bname\s*=\s*(?:'user_hash'|"user_hash"|user_hash\b))
      [^>]+\bvalue\s*=\s*(?|'([^']*)' | "([^"]*)" | ([^"'<>\s]+))
    }xi
    
     
Статус темы:
Закрыта.