Как я могу заменить текст, который не является частью тега привязки в Perl?

Что такое регулярное выражение Perl, которое может заменить выделенный текст, не являющийся частью тега привязки? Например, я хотел бы заменить только последний «текст» в следующем коде.

blah <a href="http://www.text.com"> blah text blah </a> blah text blah.

Спасибо.


person zylstra    schedule 25.01.2010    source источник
comment
глоток. Регулярные выражения и HTML. идет прятаться...   -  person Sam Holder    schedule 25.01.2010
comment
Разве первая и последняя две буквы blah также не являются частью тега привязки?   -  person Jay    schedule 25.01.2010
comment
@Jay - я предполагаю, что ОП хочет magic_replace(html, 'text', 'link still ok')   -  person Kobi    schedule 25.01.2010
comment
@Jay: Предположительно, он делает s/text/replacement/g, так что слова не совпадают. Но это не работа для регулярного выражения (одного).   -  person cjm    schedule 25.01.2010
comment
А... понял. Да, обратитесь к оригинальному тексту по этому вопросу: title="regex соответствует открытым тегам, кроме автономных тегов xhtml"> stackoverflow.com/questions/1732348/   -  person Jay    schedule 25.01.2010
comment
Говорят, что в Ултаре, который лежит за рекой Скай, никто не может анализировать html с помощью регулярных выражений.   -  person daotoad    schedule 25.01.2010


Ответы (3)


Вы не хотите пытаться анализировать HTML с помощью регулярных выражений. Вместо этого попробуйте HTML::TreeBuilder.

use HTML::TreeBuilder;

my $html = HTML::TreeBuilder->new_from_file('file.html');
# or some other method, depending on where your HTML is

doReplace($html);

sub doReplace
{
  my $elt = shift;

  foreach my $node ($elt->content_refs_list) {
    if (ref $$node) {
      doReplace($$node) unless $$node->tag eq 'a';
    } else {
      $$node =~ s/text/replacement/g;
    } # end else this is a text node
  } # end foreach $node

} # end doReplace
person cjm    schedule 25.01.2010

Я временно преобладал:

$html =~ s|(text)([^<>]*?<)(?!\/a>)|replacement$2|is;

но я был подавлен, встревожен и ослаблен основной текст; и так будет преследовать Treebuilder в последующих усилиях.

person zylstra    schedule 25.01.2010
comment
Использование парсеров html с регулярными выражениями приведет к тому, что вы закончите, как Чарльз Декстер Уорд. - person daotoad; 25.01.2010
comment
Ваше регулярное выражение также заменит текст внутри <a><i>text</i></a>, потому что оно смотрит только на первый закрывающий тег. - person cjm; 25.01.2010
comment
это зависит от того, что вы анализируете - если это небольшие, обычные строки HTML, выводимые, например, другим процессом, тогда может подойти регулярное выражение. если это настоящие полные HTML-страницы, то правильный анализатор HTML имеет смысл... - person plusplus; 26.01.2010

Не используйте регулярные выражения для подобных вещей. Используйте какой-нибудь правильный анализатор HTML и просто используйте обычное регулярное выражение для интересующих вас частей html.

person Community    schedule 25.01.2010