views:

102

answers:

1

I have a text that I want to linkify. The text could be multiline, and could contain multiple urls like the example below.

example :

My current actionscript code looks like this

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

The problem with the above script is that it recognizes the first match and uses that across. Also how do i do it for @?

Any help is highly appreciated.

Thanks

  • Manas
+1  A: 

ooph ... why does everybody use regex these days, to accomplish super simple tasks? also, you forgot, that "+" is a valid character for URLs, as a replacement for space, and even an awful lot of other characters may be used, so your pattern would not even match accordingly ...

well, anyway, have a look at AS3 regex metacharacters ... that'll GREATLY improve your expression's readability and is much more robust...

i'd go with something like this, really:

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

but the actual point, was the global flag ...

good luck then ... :)

back2dos