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

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

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

Спасибо.

Ответы [ 3 ]

8 голосов
/ 25 января 2010

Вы не хотите пытаться анализировать 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
1 голос
/ 25 января 2010

У меня временно преобладает:

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

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

0 голосов
/ 25 января 2010

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

...