Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вычленить тело связанных HTML тегов ? Использование рег. выражений на Perl-e 
:(
    Опции темы
Valder
Дата 19.4.2008, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.4.2008

Репутация: нет
Всего: нет




Есть 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) 
и узнать соответственно значение. Устал биться 
с оператором поиска ... подскажите должны
быть какая конструкция.


СПАСИБО.
PM MAIL   Вверх
arto
Дата 19.4.2008, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



perldoc HTML::Parser
perldoc HTML::TokeParser

или выделите <select>...</select>, затем внутренности. но это менее правильно.
PM MAIL ICQ   Вверх
tolkien
Дата 19.4.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Второй способ намного лучше первого. Он быстрее, меньше жрет ресурсов и работает везде. А это монстр HTML:Paraser нужен только если вы свои браузер пишете и не хотите по каким либо причинам писать собственный Parser. 
PM MAIL   Вверх
Valder
Дата 19.4.2008, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



подскажите код ... который бы выбрал <select> ... name=ZZZZ .... </select>  

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

Код

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



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

Это сообщение отредактировал(а) Valder - 19.4.2008, 01:29
PM MAIL   Вверх
tolkien
Дата 19.4.2008, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Если тебе нужен атрибут name в теге select делай так

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

например так

if ($s =~ m/<select ([^>]+)>/)
{
    my $body_select = $1;
    if ($body_select =~ m/\bname\s*=\s*['"]?([^'"\s]+)/)
   {
        $name = $1;
   }
}
PM MAIL   Вверх
Valder
Дата 19.4.2008, 02:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



Имя ищется вообще одной строкой, без лишних телодвижений ... Нужно выбрать все теги для тела данного SELECT-a.
PM MAIL   Вверх
amg
Дата 19.4.2008, 08:35 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



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;


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0786 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.