Perl Regex를 사용하여 HTML 속성에서 각각 해시를 대체 단어로 교체하려면 어떻게해야합니까?

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

  •  07-07-2019
  •  | 
  •  

문제

나는 HTML obfuscator를 작성하고 있으며, 사용자 친화적 인 이름 (ID 및 클래스)의 상관 관계가있는 해시를 난독 화 된 이름 (A, B, C 등)과 상관 관계가 있습니다. 나는 같은 것을 대체하기 위해 Regexp를 생각해내는 데 어려움을 겪고 있습니다.

<div class="left tall">

~와 함께

<div class="a b">

태그가 하나의 클래스 만 수락 할 수 있다면, regexp는 단순히

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

따옴표 내의 여러 클래스 이름을 설명하기 위해 어떻게 수정해야합니까? 바람직하게는 솔루션은 Perl 호환이어야합니다.

도움이 되었습니까?

해결책

나는 이것을 할 것 같다 :

s/  
    (class|id)="([^"]+)"
/   
    $1 . '="' . (
        join ' ', map { $hash{$_} } split m!\s+!, $2
    ) . '"'
/ex;

다른 팁

당신은 처음에 이것을 위해 Regex를 사용해서는 안됩니다. 당신은 한 번의 레 독으로 너무 많은 일을하려고합니다 (참조 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{$_} || $_ } @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