2009-07-22 3 views
0

J'ai un texte que je veux lier (identifier les URL et les convertir en liens HTML). Le texte pourrait être multiligne, et pourrait contenir plusieurs URL comme l'exemple ci-dessous.Comment lier du texte à l'aide d'ActionScript 3

Mon code actuel actionscript ressemble à ceci

<mx:Script> 
    <![CDATA[ 

    import mx.controls.Alert; 
    import mx.rpc.events.FaultEvent;  
    import mx.rpc.events.ResultEvent; 


    private function init():void { 
     var str:String = "@stack the website for google is http://www.google.com and gmail is http://gmail.com"; 

     //Alert.show(linkify(str),"Error"); 
     txtStatus.htmlText = linkify(str); 
    } 

    private function linkify(texty:String):String { 
     //return texty.replace("/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g",function(m):String { return m.linkify(m);}); 
     //return texty.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g, function(m):String {return m.linkify(m);}).replace(/(^|[^\w])(@[\d\w\-]+)/g, function(m2):String{return '@<a href="http://twitter.com/' + m2.substr(1) + '">' + m2.substr(1) + '</a>'; }); 
     var pattern:RegExp = /[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g; 
     var match:String = pattern.exec(texty); 
     return texty.replace(pattern,'<a href="' + match + '">' + 
     match + '</a>'); 
    } 

    ]]> 
</mx:Script> 

Le problème avec le script ci-dessus est qu'il reconnaît le premier match et l'utilise à travers. Aussi comment puis-je le faire pour @?

Toute aide est fortement appréciée.

Répondre

1

ooph ... pourquoi tout le monde utilise regex ces jours-ci, pour accomplir des tâches super simples? aussi, vous avez oublié, que "+" est un caractère valide pour les URL, en remplacement de l'espace, et même un awful lot of other characters peut être utilisé, donc votre modèle ne correspondrait même pas en conséquence ...

bien, de toute façon, ont un coup d'œil à AS3 regex metacharacters ... qui va améliorer considérablement la lisibilité de votre expression et est beaucoup plus robuste ...

je partirais avec quelque chose comme ça, vraiment:

var r:RegExp = /(?:http|https):\/\/\S*/g; 
trace(str.replace(r, function (s:String,...rest):String { 
    return '<a href="' + s + '">' + s + '</a>' 
})); 

mais le point réel , était le drapeau global ...

bonne chance alors ... :)

greetz

back2dos

Questions connexes