2009-08-01 5 views
3

Ich schreibe einen HTML-Obfuscator, und ich habe einen Hash korrelierenden benutzerfreundlichen Namen (von IDs und Klassen) zu verschleierten Namen (wie a, b, c, etc). Ich habe Probleme mit einem regulären Ausdruck kommen zum Erreichen ersetzen etwas wieWie ersetze ich mehrere Wörter, die jeweils auf ein alternatives Wort gehackt wurden, in einem HTML-Attribut mit Perl regex?

<div class="left tall"> 

mit

<div class="a b"> 

Wenn Etiketten mit nur einer Klasse annehmen könnte, würde die regexp einfach so etwas wie

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

Wie soll ich das korrigieren, um mehrere Klassennamen in Anführungszeichen zu berücksichtigen? Vorzugsweise sollte die Lösung Perl-kompatibel sein.

+0

Einige könnten sagen, 'links' und' groß' sind genauso verschleiert wie 'a' und' b'. –

Antwort

-1

Ich glaube, ich dies tun würde:

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

Was machen Sie, wenn der HTML-Text class = "foo" enthält? Einzelne Regexen/Substitutionen vermischen sich nicht gut mit rekursiv strukturierten Daten. –

6

Sie sollten nicht einen regulären Ausdruck für diese in erster Linie werden. Sie versuchen, mit einer Regex zu viel zu tun (siehe Can you provide some examples of why it is hard to parse XML and HTML with a regex? für warum). Was Sie brauchen, ist ein HTML-Parser. Beispiele finden Sie unter Can you provide an example of parsing HTML with your favorite parser? mit einer Vielzahl von Parsern.

Werfen Sie einen Blick auf HTML::Parser. Hier ist eine, wahrscheinlich unvollständige, Implementierung:

Verwandte Themen