Beispiel für reguläre Ausdrücke: Wiki-Parser

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Mit einem einfachen Beispiel für die Wiki-Textkonvertierung werden mehrere Verwendungsmöglichkeiten regulärer Ausdrücke veranschaulicht:

  • Konvertieren von Textzeilen, die mit einem Wiki-Quellmuster übereinstimmen, in entsprechende HTML-Ausgabestrings

  • Verwenden eines regulären Ausdrucks zum Konvertieren von URL-Mustern in <a> -Tags für HTML-Hyperlinks.

  • Verwenden eines regulären Ausdrucks zum Konvertieren von US-Dollar-Strings (z. B. „$9.95" ) in Euro-Strings (z. B. „8.24 €" ).

Die Anwendungsdateien für dieses Beispiel finden Sie unter www.adobe.com/go/learn_programmingAS3samples_flash_de . Die Dateien der Anwendung „WikiEditor“ befinden sich im Ordner „Samples/WikiEditor“. Die Anwendung umfasst die folgenden Dateien:

Datei

Beschreibung

WikiEditor.mxml

oder

WikiEditor.fla

Die Hauptanwendungsdatei im Flash-Format (FLA) oder Flex-Format (MXML).

com/example/programmingas3/regExpExamples/WikiParser.as

Eine Klasse mit Methoden, mit denen Wiki-Eingabetextmuster über reguläre Ausdrücke in die entsprechende HTML-Ausgabe konvertiert werden.

com/example/programmingas3/regExpExamples/URLParser.as

Eine Klasse mit Methoden, mit denen URL-Strings über reguläre Ausdrücke in <a> -Tags für HTML-Hyperlinks konvertiert werden.

com/example/programmingas3/regExpExamples/CurrencyConverter.as

Eine Klasse mit Methoden, mit denen US-Dollar-Strings über reguläre Ausdrücke in Euro-Strings konvertiert werden.

Definieren der WikiParser-Klasse

Die WikiParser-Klasse enthält Methoden zum Konvertieren von Wiki-Eingabetext in die entsprechende HTML-Ausgabe. Dies ist keine sehr stabile Anwendung für die Wiki-Konvertierung. Mit dieser Anwendung werden jedoch einige nützliche Einsatzmöglichkeiten von regulären Ausdrücken zum Suchen nach Übereinstimmungen mit Mustern und zum Konvertieren von Strings veranschaulicht.

Die Konstruktorfunktion in Verbindung mit der setWikiData() -Methode initialisiert wie folgt einen Beispielstring für den Wiki-Eingabetext:

public function WikiParser() 
{ 
    wikiData = setWikiData(); 
}

Wenn der Benutzer in der Beispielanwendung auf die Schaltfläche „Test“ klickt, wird die parseWikiString() -Methode des WikiParser-Objekts aufgerufen. In dieser Methode werden mehrere andere Methoden aufgerufen, mit denen der resultierende HTML-String zusammengesetzt wird.

public function parseWikiString(wikiString:String):String 
{ 
    var result:String = parseBold(wikiString); 
    result = parseItalic(result); 
    result = linesToParagraphs(result); 
    result = parseBullets(result); 
    return result; 
}

Bei jeder der aufgerufenen Methoden – parseBold() , parseItalic() , linesToParagraphs() und parseBullets() – werden die durch einen regulären Ausdruck definierten übereinstimmenden Muster mit der replace() -Methode des Strings ersetzt, sodass der Wiki-Eingabetext in Text im HTML-Format umgewandelt wird.

Konvertieren von Mustern mit Fettdruck und Kursivdruck

Die parseBold() -Methode sucht Wiki-Textmuster mit Fettdruck (z. B. '''foo''' ) und wandelt diese in das entsprechende HTML-Format um (z. B. <b>foo</b> ), wie im Folgenden dargestellt:

private function parseBold(input:String):String 
{ 
    var pattern:RegExp = /'''(.*?)'''/g; 
    return input.replace(pattern, "<b>$1</b>"); 
}

Beachten Sie, dass der Teil (.?*) des regulären Ausdrucks einer beliebigen Anzahl Zeichen ( * ) zwischen den beiden begrenzenden ''' -Mustern entspricht. Durch den ? -Quantifizierer wird eine genügsame Suche durchgeführt, sodass bei einem String wie '''aaa''' bbb '''ccc''' der erste übereinstimmende String '''aaa''' ist und nicht der gesamte String (der mit einem ''' -Muster beginnt und endet).

Durch die Klammern im regulären Ausdruck wird eine zwischengespeicherte Gruppe definiert. Die replace() -Methode verweist mit dem $1 -Code im Ersetzungsstring auf diese Gruppe. Mit dem g -Flag ( global ) im regulären Ausdruck wird sichergestellt, dass mit der replace() -Methode alle Übereinstimmungen (und nicht nur die erste Übereinstimmung) im String ersetzt werden.

Die parseItalic() -Methode ähnelt der parseBold() -Methode, mit dem Unterschied, dass mit zwei Apostrophen ( '' ) (und nicht mit drei Apostrophen) nach dem Trennzeichen für kursiven Text gesucht wird:

private function parseItalic(input:String):String 
{ 
    var pattern:RegExp = /''(.*?)''/g; 
    return input.replace(pattern, "<i>$1</i>"); 
}

Konvertieren von Mustern mit Aufzählungszeichen

Wie im folgenden Beispiel dargestellt ist, wird mit der parseBullet() -Methode nach dem Wiki-Muster mit Zeilen mit Aufzählungszeichen (z. B. * foo ) gesucht und dieses Muster in die HTML-Entsprechung umgewandelt (z. B. <li>foo</li> ):

private function parseBullets(input:String):String 
{ 
    var pattern:RegExp = /^\*(.*)/gm; 
    return input.replace(pattern, "<li>$1</li>"); 
}

Das ^ -Symbol am Anfang des regulären Ausdrucks entspricht dem Anfang einer Zeile. Durch das m -Flag ( multiline ) im regulären Ausdruck entspricht das ^ -Symbol dem Zeilenanfang und nicht dem Anfang des ganzen Strings.

Das Muster \* entspricht einem Sternchen. (Durch den umgekehrten Schrägstrich wird ein Sternchen und kein * -Quantifizierer angegeben.)

Durch die Klammern im regulären Ausdruck wird eine zwischengespeicherte Gruppe definiert. Die replace() -Methode verweist mit dem $1 -Code im Ersetzungsstring auf diese Gruppe. Mit dem g -Flag ( global ) im regulären Ausdruck wird sichergestellt, dass mit der replace() -Methode alle Übereinstimmungen (und nicht nur die erste Übereinstimmung) im String ersetzt werden.

Konvertieren von Wiki-Absatzmustern

Mit der linesToParagraphs() -Methode wird jede Zeile im Wiki-Eingabestring in das HTML-Tag <p> für Absätze konvertiert. Mit diesen Zeilen in der Methode werden leere Zeilen aus dem Wiki-Eingabestring entfernt:

var pattern:RegExp = /^$/gm; 
var result:String = input.replace(pattern, "");

Das ^ -Symbol und das $ -Symbol im regulären Ausdruck entspricht dem Anfang bzw. dem Ende einer Zeile. Durch das m -Flag ( multiline ) im regulären Ausdruck entspricht das ^-Symbol dem Zeilenanfang und nicht dem Anfang des ganzen Strings.

Mit der replace() -Methode werden alle übereinstimmenden Teilstrings (leere Zeilen) jeweils durch einen Leerstring ( "" ) ersetzt. Mit dem g -Flag ( global ) im regulären Ausdruck wird sichergestellt, dass mit der replace() -Methode alle Übereinstimmungen (und nicht nur die erste Übereinstimmung) im String ersetzt werden.

Konvertieren von URLs in <a>-HTML-Tags

Wenn der Benutzer in der Beispielanwendung auf die Schaltfläche „Test“ klickt und zuvor das Kontrollkästchen „ urlToATag aktiviert hat, wird die statische URLParser.urlToATag() -Methode aufgerufen, um URL-Strings aus dem Wiki-Eingabestring in <a> -HTML-Tags umzuwandeln.

var protocol:String = "((?:http|ftp)://)"; 
var urlPart:String = "([a-z0-9_-]+\.[a-z0-9_-]+)"; 
var optionalUrlPart:String = "(\.[a-z0-9_-]*)"; 
var urlPattern:RegExp = new RegExp(protocol + urlPart + optionalUrlPart, "ig"); 
var result:String = input.replace(urlPattern, "<a href='$1$2$3'><u>$1$2$3</u></a>");

Mithilfe der RegExp() -Konstruktorfunktion wird ein regulärer Ausdruck ( urlPattern ) aus mehreren Bestandteilen gebildet. Diese Bestandteile sind alle Strings, mit denen Teile des regulären Ausdrucks definiert werden.

Der erste Teil des regulären Ausdrucks, der durch den protocol -String definiert wird, legt ein URL-Protokoll fest: http:// oder ftp:// . Mit den Klammern wird eine nicht zwischengespeicherte Gruppe festgelegt, die durch das ? -Symbol angegeben wird. Dies bedeutet, dass die Klammern nur zum Definieren einer Gruppe für das | -Auswahlmuster verwendet werden. Die Gruppe entspricht keinem der Rückverweiscodes ( $1 , $2 , $3 ) im Ersetzungsstring der replace() -Methode.

Die anderen Bestandteile des regulären Ausdrucks verwenden jeweils zwischengespeicherte Gruppen (angegeben durch Klammern im Muster), die dann in den Rückverweiscodes ( $1 , $2 , $3 ) im Ersetzungsstring der replace() -Methode verwendet werden.

Der Teil des Musters, der über den urlPart -String definiert wird, entspricht mindestens einem der folgenden Zeichen: a-z , 0-9 , _ oder - . Mit dem + -Quantifizierer wird angegeben, dass mindestens eines dieser Zeichen übereinstimmen muss. Mit \. wird ein erforderlicher Punkt ( . ) angegeben. Der restliche Teil entspricht einem anderen String mit mindestens einem der folgenden Zeichen: a-z , 0-9 , _ oder - .

Der Teil des Musters, der über den optionalUrlPart -String definiert wird, entspricht keinem, einem oder mehreren der folgenden Zeichen: einem Punkt ( . ), gefolgt von einer beliebigen Anzahl alphanumerischer Zeichen (einschließlich _ und - ). Mit dem * -Quantifizierer wird angegeben, dass nach Übereinstimmungen mit keinem, einem oder mehreren dieser Zeichen gesucht wird.

Beim Aufrufen der replace() -Methode wird der reguläre Ausdruck verwendet und der HTML-Ersetzungsstring über Rückverweise zusammengesetzt.

Mit der urlToATag() -Methode wird dann die emailToATag() -Methode aufgerufen, mit der auf ähnliche Weise E-Mail-Muster durch <a> -Tags für Hyperlinkstrings ersetzt werden. Die regulären Ausdrücke für die Entsprechung mit HTTP-, FTP- und E-Mail-URLs in dieser Beispieldatei sind relativ einfach gehalten. Es sind sehr viel kompliziertere reguläre Ausdrücke für die korrekte Suche nach diesen URLs erforderlich.

Konvertieren von US-Dollar-Strings in Euro-Strings

Wenn der Benutzer in der Beispielanwendung auf die Schaltfläche „Test“ klickt und zuvor das Kontrollkästchen dollarToEuro aktiviert hat, wird die statische CurrencyConverter.usdToEuro() -Methode aufgerufen, um US-Dollar-Strings (z. B. „$9.95" ) wie folgt in Euro-Strings (z. B. „8.24 €" ) umzuwandeln:

var usdPrice:RegExp = /\$([\d,]+.\d+)+/g; 
return input.replace(usdPrice, usdStrToEuroStr); 

In der ersten Zeile ist ein einfaches Muster für US-Dollar-Strings definiert. Beachten Sie, dass dem $ -Zeichen ein umgekehrter Schrägstrich ( \ ) als Escape-Zeichen vorangestellt ist.

Die replace() -Methode verwendet den regulären Ausdruck zum Suchen von Mustern und ruft die usdStrToEuroStr() -Funktion auf, um den Ersetzungsstring zu ermitteln (ein Wert in Euro).

Wenn als zweiter Parameter der replace() -Methode der Name einer Funktion verwendet wird, werden folgende Elemente als Parameter an die aufgerufene Funktion übergeben:

  • Der übereinstimmende Teil des Strings

  • Alle übereinstimmenden zwischengespeicherten (in Klammern eingeschlossenen) Gruppen. Die Anzahl der auf diese Weise übergebenen Argumente hängt von der Anzahl der Übereinstimmungen mit einer zwischengespeicherten Gruppe ab. Sie können die Anzahl der Übereinstimmungen mit zwischengespeicherten Gruppen ermitteln, indem Sie im Funktionscode arguments.length - 3 überprüfen.

  • Die Indexposition im String, an der die Übereinstimmung beginnt.

  • Der vollständige String.

Mit der usdStrToEuroStr() -Methode werden US-Dollar-Strings wie folgt in Euro-Strings konvertiert:

private function usdToEuro(...args):String 
{ 
    var usd:String = args[1]; 
    usd = usd.replace(",", ""); 
    var exchangeRate:Number = 0.828017; 
    var euro:Number = Number(usd) * exchangeRate; 
    trace(usd, Number(usd), euro); 
    const euroSymbol:String = String.fromCharCode(8364); // € 
    return euro.toFixed(2) + " " + euroSymbol;  
}

Beachten Sie, dass args[1] die zwischengespeicherte Gruppe angibt, die dem regulären Ausdruck usdPrice entspricht. Dies ist der numerische Teil des US-Dollar-Strings, d. h. der Dollarbetrag ohne das $ -Zeichen. Mit der Methode wird eine Währungsumrechnung durchgeführt und der resultierende String zurückgegeben (mit einem nachgestellten €-Symbol anstelle des vorangestellten $-Symbols).