Esempio di espressioni regolari: parser Wiki

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

Questo esempio di conversione di un semplice testo Wiki illustra alcune applicazioni delle espressioni regolari:

  • Conversione di righe di testo che associano un modello Wiki di origine alle stringhe di output HTML appropriate.

  • Uso di un'espressione regolare per convertire modelli URL in tag di collegamento ipertestuale HTML <a> .

  • Uso di un'espressione regolare per convertire stringhe in dollari USA (come "$9,95" ) in stringhe in euro (come "8,24 €" ).

Per ottenere i file dell'applicazione per questo esempio, visitate la pagina www.adobe.com/go/learn_programmingAS3samples_flash_it . I file dell'applicazione WikiEditor si trovano nella cartella Samples/WikiEditor. L'applicazione è composta dai seguenti file:

File

Descrizione

WikiEditor.mxml

o

WikiEditor.fla

Il file principale dell'applicazione in Flash (FLA) o Flex (MXML)

com/example/programmingas3/regExpExamples/WikiParser.as

Classe che comprende metodi che usano espressioni regolari per convertire modelli di testo di Wiki nell'output HTML equivalente.

com/example/programmingas3/regExpExamples/URLParser.as

Classe che comprende metodi che usano espressioni regolari per convertire stringhe URL in tag di collegamento ipertestuale HTML <a> .

com/example/programmingas3/regExpExamples/CurrencyConverter.as

Classe che comprende metodi che usano espressioni regolari per convertire stringhe in dollari in stringhe in euro.

Definizione della classe WikiParser

La classe WikiParser comprende metodi che convertono testo di Wiki nell'output HTML equivalente. Non si tratta di un'applicazione di conversione Wiki particolarmente versatile, ma illustra degnamente alcuni impieghi delle espressioni regolari per la ricerca di modelli e la conversione di stringhe.

La funzione di costruzione, insieme al metodo setWikiData() , si limita a inizializzare una stringa campione di testo Wiki nel modo seguente:

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

Quando l'utente seleziona il pulsante Test dell'applicazione, l'applicazione chiama il metodo parseWikiString() dell'oggetto WikiParser. Questo metodo chiama, a sua volta, altri metodi che si occupano di assemblare la stringa HTML convertita.

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

Ognuno dei metodi chiamati, parseBold() , parseItalic() , linesToParagraphs() e parseBullets() , usa il metodo replace() della stringa per sostituire le corrispondenze dei modelli individuate, definite da un'espressione regolare, allo scopo di trasformare il testo Wiki in testo HTML.

Conversione dei modelli in grassetto e corsivo

Il metodo parseBold() cerca un modello di testo grassetto Wiki (come '''foo''' ) e lo converte nell'equivalente HTML (come <b>foo</b> ) nel modo seguente:

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

Si noti che la porzione (.?*) dell'espressione regolare cerca qualsiasi numero di caratteri ( * ) tra i due modelli di definizione ''' . Il quantificatore ? rende la corrispondenza “lazy”, vale a dire che la prima corrispondenza trovata per la stringa '''aaa''' bbb '''ccc''' sarà '''aaa''' e non l'intera stringa (che inizia e finisce con ''' ).

Le parentesi all'interno dell'espressione regolare definiscono un gruppo di cattura e il metodo replace() fa riferimento a tale gruppo mediante il codice $1 della stringa di sostituzione. Il flag g ( global ) dell'espressione regolare fa in modo che il metodo replace() sostituisca tutte le corrispondenze nella stringa (e non solo la prima).

Il metodo parseItalic() opera in modo analogo al metodo parseBold() , con l'eccezione che cerca due, e non tre, apostrofi ( '' ) come delimitatori del testo in corsivo:

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

Conversione di modelli puntati

Come illustra l'esempio seguente, il metodo parseBullet() cerca il modello riga puntata Wiki (come * foo ) e lo converte nel suo equivalente HTML (come <li>foo</li> ):

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

Il simbolo ^ all'inizio dell'espressione regolare corrisponde alla posizione iniziale di una riga. Il flag m ( multiline ) nell'espressione regolare fa in modo che il simbolo ^ corrisponda alla posizione iniziale di una riga, non semplicemente di una stringa.

Il modello \* cerca il carattere asterisco (la barra rovesciata segnala l'impiego del valore letterale dell'asterisco e non del suo valore di quantificatore * ).

Le parentesi all'interno dell'espressione regolare definiscono un gruppo di cattura e il metodo replace() fa riferimento a tale gruppo mediante il codice $1 della stringa di sostituzione. Il flag g ( global ) dell'espressione regolare fa in modo che il metodo replace() sostituisca tutte le corrispondenze nella stringa (e non solo la prima).

Conversione modelli Wiki di paragrafo

Il metodo linesToParagraphs() converte ogni riga della stringa di input Wiki in un tag di paragrafo HTML <p> . Queste righe del metodo eliminano le righe vuote dalla stringa di input Wiki:

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

I simboli ^ e $ dell'espressione regolare corrispondono alla posizione iniziale e finale di una riga. Il flag m ( multiline ) nell'espressione regolare fa in modo che il simbolo ^ corrisponda alla posizione iniziale di una riga, non semplicemente di una stringa.

Il metodo replace() sostituisce tutte le sottostringhe individuate (righe vuote) con una stringa vuota ( "" ). Il flag g ( global ) dell'espressione regolare fa in modo che il metodo replace() sostituisca tutte le corrispondenze nella stringa (e non solo la prima).

Conversione degli URL in tag HTML <a>

Quando l'utente seleziona il pulsante Test dell'applicazione, se la casella urlToATag è selezionata, l'applicazione chiama il metodo statico URLParser.urlToATag() per convertire le stringhe URL della stringa di input Wiki in tag HTML <a> .

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>");

La funzione di costruzione RegExp() viene usata per creare un'espressione regolare ( urlPattern ) assemblando vari componenti costituenti. Questi componenti sono le singole stringhe che definiscono una porzione del modello dell'espressione regolare.

La prima porzione del modello dell'espressione regolare, definito dalla stringa protocol , definisce il protocollo URL: http:// o ftp:// . Le parentesi definiscono un gruppo di non cattura, indicato dal simbolo ? . Ciò significa che le parentesi definiscono semplicemente un gruppo per il modello di alternanza | e che il gruppo non cerca riferimenti a posteriori ( $1 , $2 , $3 ) nella stringa di sostituzione del metodo replace() .

Tutti gli altri componenti costituenti dell'espressione regolare usano gruppi di cattura (indicati dalle parentesi nel modello) che, a loro volta, vengono usati nei riferimenti a posteriori ( $1 , $2 , $3 ) nella stringa di sostituzione del metodo replace() .

La porzione di modello definita dalla stringa urlPart corrisponde ad almeno uno dei seguenti caratteri: a-z , 0-9 , _ o - . Il quantificatore + indica che è stata individuata la corrispondenza ad almeno un carattere. \. indica un punto obbligatorio ( . ). Il resto corrisponde a un'altra stringa con almeno uno dei seguenti caratteri: a-z , 0-9 , _ o - .

La porzione di modello definita dalla stringa optionalUrlPart corrisponde a zero o più elementi seguenti: un carattere punto ( . ) seguito da un numero qualsiasi di caratteri alfanumerici (compresi i caratteri _ e - ). Il quantificatore * indica che è stata individuata la corrispondenza a zero o più caratteri.

La chiamata al metodo replace() impiega l'espressione regolare e assembla la stringa HTML di sostituzione servendosi di riferimenti a posteriori.

Il metodo urlToATag() chiama, quindi, il metodo emailToATag() , che usa una tecnica simile per convertire modelli e-mail con collegamenti ipertestuali HTML <a> . Le espressioni regolari usate in questo file di esempio per trovare gli URL HTTP, FTP ed e-mail sono relativamente semplici per motivi di chiarezza. In realtà, esistono espressioni regolari molto più complesse che permettono di individuare gli URL con una maggiore precisione.

Conversione delle stringhe in dollari USA in stringhe in euro

Quando l'utente seleziona il pulsante Test dell'applicazione, se la casella di controllo dollarToEuro è selezionata, l'applicazione chiama il metodo statico CurrencyConverter.usdToEuro() per convertire le stringhe in dollari USA (come "$9,95" ) in stringhe in euro (come "8,24 €" ) nel modo seguente:

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

La prima riga definisce un semplice modello per la ricerca delle stringhe in dollari USA. Notate che il carattere $ è preceduto dal carattere di escape barra rovesciata ( \ ).

Il metodo replace() usa l'espressione regolare come motore di ricerca del modello e chiama la funzione usdStrToEuroStr() per determinare la stringa di sostituzione, cioè il valore corrispondente in euro.

Quando il nome di una funzione viene usato come secondo parametro del metodo replace() , i seguenti elementi vengono passati come parametri della funzione chiamata:

  • La porzione corrispondente della stringa.

  • Qualsiasi corrispondenza a gruppi parentetici catturata. Il numero di argomenti passati in questo modo varia a seconda del numero di corrispondenze a gruppi parentetici catturate. È possibile determinare il numero di corrispondenze a gruppi parentetici catturate verificando arguments.length - 3 all'interno del codice della funzione.

  • La posizione di indice nella stringa in cui inizia la corrispondenza.

  • La stringa completa.

Il metodo usdStrToEuroStr() converte le stringhe in dollari USA in stringhe in euro nel modo seguente:

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;  
}

Si noti che args[1] rappresenta il gruppo parentetico catturato trovato dall'espressione regolare usdPrice . Questa è la porzione numerica della stringa relativa ai dollari USA, cioè l'importo in dollari senza il segno $ . Il metodo applica un conversione del tasso di cambio e restituisce la stringa risultante (con un simbolo € finale anziché un simbolo $ iniziale).