如何使用Perl正则表达式在HTML属性中替换多个单词,每个单词和另一个单词?

StackOverflow https://stackoverflow.com/questions/1217068

  •  07-07-2019
  •  | 
  •  

我正在编写一个HTML混淆器,我有一个哈希将用户友好名称(id和类)与模糊名称(如a,b,c等)相关联。我无法想出一个正则表达式来完成替换

之类的东西
<div class="left tall">

<div class="a b">

如果标签只能接受一个类,那么正则表达式就像是

s/(class|id)="(.*?)"/$1="$hash{$2}"/

如何更正此问题以解释引号内的多个类名?优选地,该解决方案应该与Perl兼容。

有帮助吗?

解决方案

我想我会这样做:

s/  
    (class|id)="([^"]+)"
/   
    $1 . '="' . (
        join ' ', map { $hash{

我想我会这样做:

<*>} } split m!\s+!, $2 ) . '"' /ex;

其他提示

首先,您不应该使用正则表达式。您正在尝试使用一个正则表达式做太多(请参阅您能提供一些示例,说明为什么难以使用正则表达式解析XML和HTML吗?为什么)。你需要的是一个HTML解析器。有关使用各种解析器的示例,请参阅您是否可以提供使用您喜欢的解析器解析HTML的示例?

查看 HTML :: Parser 。这是一个可能不完整的实现:

#!/usr/bin/perl

use strict;
use warnings;

use HTML::Parser;

{
    my %map = (
        foo => "f",
        bar => "b",
    );

    sub start {
        my ($tag, $attr) = @_;
        my $attr_string = '';
        for my $key (keys %$attr) {
            if ($key eq 'class') {
                my @classes = split " ", $attr->{$key};
                #FIXME: this should be using //, but
                #it is only availble starting in 5.10
                #so I am using || which will do the
                #wrong thing if the class is 0, so
                #don't use a class of 0 in %map , m'kay
                $attr->{$key} = join " ", 
                    map { $map{

首先,您不应该使用正则表达式。您正在尝试使用一个正则表达式做太多(请参阅您能提供一些示例,说明为什么难以使用正则表达式解析XML和HTML吗?为什么)。你需要的是一个HTML解析器。有关使用各种解析器的示例,请参阅您是否可以提供使用您喜欢的解析器解析HTML的示例?

查看 HTML :: Parser 。这是一个可能不完整的实现:

<*>} ||

首先,您不应该使用正则表达式。您正在尝试使用一个正则表达式做太多(请参阅您能提供一些示例,说明为什么难以使用正则表达式解析XML和HTML吗?为什么)。你需要的是一个HTML解析器。有关使用各种解析器的示例,请参阅您是否可以提供使用您喜欢的解析器解析HTML的示例?

查看 HTML :: Parser 。这是一个可能不完整的实现:

<*> } @classes; } $attr_string .= qq/ $key="$attr->{$key}"/; } print "<$tag$attr_string>"; } } sub text { print shift; } sub end { my $tag = shift; print "</$tag>"; } my $p = HTML::Parser->new( start_h => [ \&start, "tagname,attr" ], text_h => [ \&text, "dtext" ], end_h => [ \&end, "tagname" ], ); $p->parse_file(\*DATA); __DATA__ <html> <head> <title>foo</title> </head> <body> <span class="foo">Foo!</span> <span class="bar">Bar!</span> <span class="foo bar">Foo Bar!</span> This should not be touched: class="foo" </body> </html>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top