Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Как вычленить тело связанных HTML тегов ?


Автор: Valder 19.4.2008, 00:26

Есть HLML код типа с кучей комбо-боксов подобных этому:

Код

<select style="width: 300px;"  name=category
  OnChange="this.form.action ='  ......; this.form.submit.click()">

  <option value='2'  >A0</option>
<option value='3'  >A1 </option>
<option value='5'  >A2</option>
<option value='8'  >A3</option>
<option value='9'  selected >A3</option>
<option value='11'  >A5</option>
<option value='16'  >A6</option>
<option value='17'  >A7 </option>
<option value='19'  >A8 </option>
</select>


Хочу на с помощью рег. выражений вычленить тело 
для имени каждого SELECT-a (н-р этот: category) 
и узнать соответственно значение. Устал биться 
с оператором поиска ... подскажите должны
быть какая конструкция.


СПАСИБО.

Автор: arto 19.4.2008, 00:54
perldoc HTML::Parser
perldoc HTML::TokeParser

или выделите <select>...</select>, затем внутренности. но это менее правильно.

Автор: tolkien 19.4.2008, 01:03
Второй способ намного лучше первого. Он быстрее, меньше жрет ресурсов и работает везде. А это монстр HTML:Paraser нужен только если вы свои браузер пишете и не хотите по каким либо причинам писать собственный Parser. 

Автор: Valder 19.4.2008, 01:20
подскажите код ... который бы выбрал <select> ... name=ZZZZ .... </select>  

Пробовал что-то типа такого:

Код

$_ =~ /<select [^>]+ name\=ZZZZ([^|]+)(?<!<\/select>)/g;



Выбирает все до конца текста

Автор: tolkien 19.4.2008, 01:53
Если тебе нужен атрибут name в теге select делай так

Выбрать сначала тег

например так

if ($s =~ m/<select ([^>]+)>/)
{
    my $body_select = $1;
    if ($body_select =~ m/\bname\s*=\s*['"]?([^'"\s]+)/)
   {
        $name = $1;
   }
}

Автор: Valder 19.4.2008, 02:49
Имя ищется вообще одной строкой, без лишних телодвижений ... Нужно выбрать все теги для тела данного SELECT-a.

Автор: amg 19.4.2008, 08:35
Valder, самому парсить html не рекомендуется - это сложно, ненадежно и получется громоздкий малопонятный код. По возможности используйте модули, для этого предназначенные, например, те, на которые указал arto. Если же парсите сами, лучше не пытаться воткнуть все в одну регулярку, а действовать примерно так, как предложил tolkien.
Код
my $html = q(
<select style="width: 300px;"  name=category
  OnChange="this.form.action ='  ......; this.form.submit.click()">

  <option value='2'  >A0</option>
<option value='3'  >A1 </option>
<option value='5'  >A2</option>
<option value='8'  >A3</option>
<option value='9'  selected >A3</option>
<option value='11'  >A5</option>
<option value='16'  >A6</option>
<option value='17'  >A7 </option>
<option value='19'  >A8 </option>
</select>
);

my %tags;
while ($html =~ /<select([^>]*)>((?:.(?!=<\/select>))*)<\/select>/gs) {
  my $body = $1;
  $tags{$1} = $2 while $body =~ s/\s*(\w+)\s*=\s*"([^"]+)"//;
  $tags{$1} = $2 while $body =~ s/\s*(\w+)\s*=\s*(\S+)//;
}

print "$_ => $tags{$_}\n" foreach keys %tags;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)