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

Статус
В этой теме нельзя размещать новые ответы.

black.cat

Мастер
Регистрация
13 Ноя 2008
Сообщения
200
Реакции
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+)' чтобы точно знать что я выдрал его с тэга инпут с атрибами нэйм и тайп ?
 
на 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";
    }
  }
}
?>
 
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'];
 
алгоритм простой

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

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

хотя в массив загонять не обязательно - можно на лету проверять, но так тебе будет нагляднее
 
сделал помоему проще:
PHP:
function get_hidden($html) {
  $hdn=false;
  $nm=false;
  $ret="";
// выдрать форму
  preg_match_all("/(<form[^>]+name=['\"]?inputform['\"]?.*<\/form>)/isU", $html, $forms, PREG_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;
}
А хотелось решить все одной строкой :((
 
Вот
Код:
{
<input\b
  (?=[^>]+\btype\s*=\s*(?:'hidden'|"hidden"|hidden\b))
  (?=[^>]+\bname\s*=\s*(?:'user_hash'|"user_hash"|user_hash\b))
  [^>]+\bvalue\s*=\s*(?|'([^']*)' | "([^"]*)" | ([^"'<>\s]+))
}xi
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху