Beispiel für reguläre Ausdrücke: Wiki-ParserFlash 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:
Die Anwendungsdateien für dieses Beispiel finden Sie auf 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:
Definieren der WikiParser-KlasseDie 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 KursivdruckDie 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ählungszeichenWie 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-AbsatzmusternMit 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-TagsWenn 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-StringsWenn 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:
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). |
|