使用正则表达式替换子字符串

时间:2009-06-03 19:01:09

标签: regex coldfusion

我想在任何包含mailto:标记的href中添加对onclick事件的调用。

例如,我想采取以下任何一个实例:

<a href="mailto:user@domain.com">

并将其更改为:

<a href="mailto:user@domain.com" onclick="return function();">

我遇到的问题是mailto字符串的值不一致。

我需要说一些事情,例如将“>”字符的所有实例替换为与“onclick="return function();">”匹配的字符串中的“<a href="mailto:*">”。

我在ColdFusion中使用REreplacenocase()函数执行此操作,但欢迎使用一般的RegEx建议。

3 个答案:

答案 0 :(得分:3)

以下内容会将您的onclick添加到包含字符串str的所有mailto链接中:

REReplaceNoCase(
    str,
    "(<a[^>]*href=""mailto:[^""]*""[^>]*)>",
    "\1 onclick=""return function();"">",
    "all"
)

这个正则表达式将会发现任何看起来像是电子邮件链接的<a ...>标记(即使用mailto协议具有href属性),并为其添加onclick属性。直到标记末尾的所有内容都将存储在第一个后台(由替换字符串中的\ 1引用)中,以便保留<a>中的任何其他属性。

答案 1 :(得分:2)

如果这样做的唯一目的是添加JavaScript事件处理程序,我认为Regex不是最佳选择。如果您使用JavaScript来连接您的JavaScript事件,如果JS不可用,您将获得更优雅的降级(例如,什么都不会发生,而不是在整个标记中散布onclick cruft)。

另外,使用DOM可以消除错误匹配或误报的可能性,因为正则表达式无法完全预测每个可能的标记形成:

function myClickHandler() {
    //do stuff
    return false;
}

var links = document.getElementsByTagName('a');
for(var link in links) {
    if(link.href.indexOf('mailto:') == 0) {
        link.onclick = myClickHandler;
    }
}

答案 2 :(得分:1)

为什么不在前端使用像jQuery这样的库?

这样做
$(function(){
 $("a[href^=mailto]").click(function(){
  // place the code you want to execute here
 })
});