如何使用as3中的regex替换文本中的所有链接?

时间:2009-11-17 12:33:34

标签: regex flash actionscript-3 string

  

可能重复:
  How do I linkify text using ActionScript 3

我使用正则表达式查找通用字符串中的链接并突出显示该文本(下划线,href,任何内容)。

这是我到目前为止所拥有的:

var linkRegEx:RegExp = new RegExp("(https?://)?(www\\.)?([a-zA-Z0-9_%]*)\\b\\.[a-z]{2,4}(\\.[a-z]{2})?((/[a-zA-Z0-9_%]*)+)?(\\.[a-z]*)?(:\\d{1,5})?","g");
var link:String = 'generic links: www.google.com http://www.yahoo.com  stackoverflow.com';
link = addLinks(linkRegEx,link);
textField.htmlText = link;//textField is a TextField I have on stage

function addLinks(pattern:RegExp,text:String):String{
    while((pattern.test(text))!=false){
        text=text.replace(pattern, "<u>link</u>");
    }
    return text;
}

我将所有文本替换为“link”。我想要使​​用与expresion相匹配的相同文本而不是“link”。我试过了

text=text.replace(pattern, "<u>"+linkRegEx.exec(text)[0]+"</u>");
但是我遇到了麻烦。我不认为我完全理解正则表达式和替换方法是如何工作的。

3 个答案:

答案 0 :(得分:2)

好的,我已经阅读了replace()方法的文档。

有两个关键的事情:

  1. 您可以使用 $&amp; 来获取匹配的子字符串。那里有许多方便和怪异的符号。
  2. 在更换时使用第二个字符串,否则你会在无尽的循环中结束,小黑色的整体会不时地产生。
  3. 以下是该函数的正确版本:

    function addLinks(pattern:RegExp,text:String):String{
        var result = '';
        while(pattern.test(text)) result = text.replace(pattern, "<font color=\"#0000dd\"><a href=\"$&\">$&</a></font>");
        if(result == '') result+= text;//if there was nothing to replace
        return result;
    }
    

    正如Cay所提到的,样式表更适合造型。 感谢您的投入。

    <强>更新

    当链接包含#符号时,上面列出的RegEx不起作用。 这是该函数的更新版本:

    function addAnchors(text:String):String{
        var result:String = '';
        var pattern:RegExp = /(?<!\S)(((f|ht){1}tp[s]?:\/\/|(?<!\S)www\.)[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/g;
        while(pattern.test(text)) result = text.replace(pattern, "<font color=\"#0000dd\"><a href=\"$&\">$&</a></font>");
        if(result == '') result+= text;//if there was nothing to replace
        return result;
    }
    

答案 1 :(得分:1)

我读到here在AS3中你有一个替换函数,你可以在其中传递一个执行自定义操作的回调。这看起来比使用标准正则表达式捕获组更灵活。

答案 2 :(得分:1)

如果您只需要在文本字段中为所有链接加下划线,那么正确的方法应该是使用StyleSheet ...尝试使用以下内容:

var style:StyleSheet = new StyleSheet();
style.setStyle("a", {textDecoration:"underline"});
tf.styleSheet=style;
tf.htmlText="hello <a href='#test'>world</a>";