2017-06-07 5 views
0

Ich möchte eine JavaScript-Funktion schreiben, um href-Tags zu ersetzen, die einen mailto-Link enthalten.Regex zum Ersetzen von Mailto-Links (Javascript)

<a href="mailto:[email protected]">Email me</a>! 

Sollte sich:

<a href="&lt;%='mailto:[email protected]'%&gt;">Email me</a>! 

Dies ist für eine Anwendung, die HTML-Code in einem Dritt Service-Feeds, und der Service ist in gebrochenem, dass es nicht akzeptieren, mailto-URLs, aber wenn wir maskiere es als Variable, es wird akzeptiert. Ich habe es nur schwer, mein nicht regex-freundliches Gehirn darum zu wickeln, nur den inneren Teil der href-Tags zu ersetzen.

Vielen Dank für Ihre Hilfe!

+1

Sie sollten einen HTML-Parser verwenden. – SLaks

+1

ZA̡͊͠͝LGΌ empfiehlt Regex - sollte die Regex über das gesamte HTML-Dokument oder nur die extrahierten Anchor-Tags oder sogar nur die href-Attribute funktionieren? –

Antwort

2

Sie können HTML mit RegEx nicht vollständig analysieren, aber Sie können einen HTML-Parser verwenden und einfach die href-Attribute des Anchor-Tags mit Regex analysieren und ersetzen.

Die folgenden Angaben sind relevant:

Das Attribut href auf einem und Flächenelemente müssen einen Wert haben, der eine gültige URL möglicherweise durch Leerzeichen umgeben ist. ...

Eine Zeichenfolge ist eine gültige URL, die möglicherweise von Leerzeichen umgeben ist, wenn sie nach vorangestelltes und nachkommendes Leerzeichen daraus entfernt eine gültige URL ist. ...

Eine URL ist eine gültige URL, wenn sie den Anforderungen der Authoring-Konformität in der WHATWG-URL-Spezifikation entspricht. [URL]

Siehe http://w3c.github.io/html/single-page.html#valid-url

Absoluter-URL-Zeichenfolge sein muss [...] ein URL-Schema Zeichenfolge, die eine ASCII-Groß- und Kleinschreibung Übereinstimmung für eine Sonderregelung ist und nicht ein ASCII Groß- und Kleinschreibung Übereinstimmung für "Datei", gefolgt von U + 003A (:) und eine System-Bezug-special-URL-Zeichenfolge ...

Siehe https://url.spec.what

eine robuste regex so sein muss Groß- und Kleinschreibung und akzeptieren Leerzeichen:

let href = " MailTO:[email protected] "; 
 
let result = href.replace(/^\s*mailto:.*$/i, "&lt;%='$&'%&gt;"); 
 
console.log(result);

Während Sie auch Ankerelement analysieren können mit regex Attributen, benötigen Sie einen HTML-Parser die Ankerelemente in Ihren HTML-Dokumenten zu finden. Und da Sie ohnehin einen HTML-Parser benötigen, können Sie sich darauf verlassen, dass auch die Ankerelemente und ihre href-Attribute extrahiert werden.