简单的javascript正则表达式帮助需要...(跳过字符)

时间:2011-08-22 20:21:04

标签: javascript regex

我有一些正则表达式代码可将字符串中的任何网址http://www.url.com转换为超链接,即<a href='http://www.url.com'>http://www.url.com</a>

正则表达式代码:

var exp = /(\b(https?|):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;   
toReturn = toReturn.replace(exp,"<a target='_blank' href='$1'>$1</a>"); 

但是我不希望它专门搜索/替换某些字符[img] [/ img]

**注意:[img] [/ img]和网址可能在字符串中多次...

我该怎么做?

非常感谢,

2 个答案:

答案 0 :(得分:1)

仅仅使用正则表达式会非常棘手。这是因为正则表达式只能匹配regular languages *,并且任何具有打开/关闭标记的语言都不太可能是常规的。

(*在实践中,大多数编程语言中的“正则表达式”实际上并不是常规的,并且具有匹配更复杂语言的设施......但我很少发现这些设施有用,我认为它们不值得用于此问题)。

更好的方法是编写一个简单的解析器,根据标记拆分输入,然后只针对可能包含URL的部分运行正则表达式。

例如:

function fix_urls(str) {
    var result = [];
    var url_re = /\bhttp:…/g;
    var tag_re = /(\[\/?[a-zA-Z]+\])/g;
    var split = str.split(tag_re);
    var in_tag = 0;
    for (var i = 0; i < split.length; i += 1) {
        var part = split[i];
        if (part.search(tag_re) == 0) {
            if (part[1] == "/")
                in_tag -= 1;
            else
                in_tag += 1;
        } else if (in_tag == 0) {
            part = part.replace(url_re, "<a …>…</a>");
        }
        result.push(part);
    }
    return result.join("");
 }

答案 1 :(得分:0)

当需要上下文敏感的编辑时,全局替换只是错误的方法。您可以使用 scanner 找到连续的标记,然后在循环输出中更改一些标记,并进行一些编辑。我无法使用标准的javascript或其regexp方法找到如何做到这一点。如果您找到使用regexp或类似名称定义令牌的javascript Tokenizer,那么您几乎就在那里。