2009-06-03 15 views
1

Ich möchte einen Aufruf zu einem onclick-Ereignis in einem beliebigen href hinzufügen, der ein mailto: -Tag enthält.Ersetzen eines Teilstrings mit regulären Ausdrücken

Zum Beispiel, ich möchte von jeder Instanz nehmen:

<a href="mailto:[email protected]"> 

Und es in ändern:

<a href="mailto:[email protected]" onclick="return function();"> 

Das Problem, das ich habe, ist, dass der Wert des mailto String nicht konsistent.

Ich muss sagen, so etwas wie alle Instanzen der mit ‚onclick="return function();">‘ in Strings ‚>‘ Zeichen ersetzen, die ‚<a href="mailto:*">‘ entsprechen.

Ich mache dies in ColdFusion mit der REreplacenocase() -Funktion, aber allgemeine RegEx-Vorschläge sind willkommen.

+2

Svante

Antwort

3

Die folgende Ihre Onclick auf alle hinzufügen, werden mailto-Links enthalten einen String withing str.

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

Was dieser reguläre Ausdruck jeden <a ...> Tag angeboten werden tun, was es sieht aus wie ein E-Mail-Link (dh hat ein href-Attribut der mailto p Rotocol) und fügen Sie das onclick-Attribut hinzu. Alles bis zum Ende des Tags wird im ersten Backreferrence gespeichert (in der Ersetzungszeichenfolge mit \ 1 bezeichnet), so dass alle anderen Attribute in <a> beibehalten werden.

2

Wenn der einzige Zweck davon ist, einen JavaScript-Event-Handler hinzuzufügen, glaube ich nicht, dass Regex die beste Wahl ist. Wenn du JavaScript verwendest, um deine JavaScript-Ereignisse zu verkabeln, wirst du eine graziösere Verschlechterung erleiden, wenn JS nicht verfügbar ist (z. B. wird nichts passieren, anstatt dass der Onclick-Crust über dein Markup verstreut ist).

Plus das DOM mit der Möglichkeit der fehlenden Übereinstimmungen oder Fehlalarme eliminiert, die aus einem Regex auftreten können, die perfekt nicht jede mögliche Markup Bildung vorwegzunehmen:

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; 
    } 
} 
1

Warum würden Sie dies nicht am Frontend mit einer Bibliothek wie jQuery tun?

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