Как стать автором
Обновить

Комментарии 16

У меня в perl-модуле Regexp::Common::RealHTML есть более корректная реализация этого регулярного выражения, рекомендую посмотреть.
вы не могли бы перезалить архив, а то архивер говорит, что повреждён.
С архивом всё в порядке, я только что проверил. Либо ваш архивер не понимает .tar.gz, либо побился при выкачке.
к сожалению, не удалось достать из архива
$ tar -zxf Regexp-Common-RealHTML-1.05.tar.gz
tar: Cannot use compressed or remote archives
tar: Error is not recoverable: exiting now
$ mv Regexp-Common-RealHTML-1.05.tar.gz Regexp-Common-RealHTML-1.05.tar.gz.gz
$ gzip -d Regexp-Common-RealHTML-1.05.tar.gz.gz
$ tar -zxf Regexp-Common-RealHTML-1.05.tar.gz

Честно говоря, раньше такого безобразия за своим mod_gzip не замечал, всё нормально качалось. Возможно, после последних обновлений Gentoo что-то начало глючить.
Ага, я, кажется, понял. Похоже, веб-сервер при выкачке его ещё раз дополнительно gzip-ает, вероятно mod_gzip постарался. Так что после выкачки он превращается в .tar.gz.gz.
точно, таки двойной gzip
интересно, спасибо. но у меня не было столь всеучитывающей задачи :)
Парсинг - одна из самых сложных и подверженных ошибкам задач. Тем более парсинг такой нечёткой штуки, как HTML. Тем более, когда хочется чтобы твой парсер увидел те же теги и параметры, что и браузеры. Поэтому я предпочёл один раз вынести эти regexp-ы в отдельную библиотеку, чтобы не писать многократно разные regexp-ы, каждый раз с разными ошибками.
здесь у меня на входе уже сразу строка параметров.
но а парсинг HMTL я бы переложил на плечи какой-нибудь расширяемой XML либы с callback функционалом.

вобще, люблю задачки с парсингом, но на PHP их решать затруднительно, так как работа со строками не стандартным функционалом, а своим алгоритмом происходит достаточно долго.
а куда уходит параметр когда ``lvalue='' и ``=rvalue''?
Если Вам нужна надёжная поддержка пустых имени/значения, то пример записи можно взять из кода модуля, где определяется $param. В результате получим:

$s = 'single param=true param2="string fgfg" =v1 p1= ="" "last"="value"';

use Regexp::Common qw/ RealHTML /;
$s =~ /\A\w+/g; # пропустить имя тега
while ($s =~ /\G\s+(?:
    $RE{pname}{-keep} (?: = $RE{pval}{-keep}? )? | = $RE{pval}{-keep}?
    )/gxo) {
  my ($name, $value) = ($1, $2|$3);
  print "name='$name' value='$value'\n";
}

__END__
name='param' value='true'
name='param2' value='string fgfg'
name='' value='v1'
name='p1' value=''
name='' value=''
name='last' value='value'

Если пустые имена/значения Вас не очень интересуют, то всё гораздо проще:

$s = 'single param=true param2="string fgfg" "last"="value"'

use Regexp::Common qw/ RealHTML /;
$s =~ /\A\w+/g; # пропустить имя тега
while ($s =~ /\G\s+$RE{pname}{-keep}=$RE{pval}{-keep}/go) {
  my ($name, $value) = ($1, $2);
  print "name='$name' value='$value'\n";
}

__END__
name='param' value='true'
name='param2' value='string fgfg'
name='last' value='value'
пасиба!
НЛО прилетело и опубликовало эту надпись здесь
хм, не знал, что можно расцвеченый регексп пастить.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации