用于替换mailto链接的正则表达式(Javascript)

时间:2017-06-07 18:06:52

标签: javascript

我想编写一个Javascript函数来替换包含mailto链接的href标记。

<a href="mailto:foo@bar.com">Email me</a>!

应该成为:

<a href="&lt;%='mailto:foo@bar.com'%&gt;">Email me</a>!

这适用于将HTML提供给第三方服务的应用程序,并且该服务因为它不接受mailto URL而被破坏,但如果我们将其作为变量进行掩码,它将接受它。我只是很难将非正则表达式友好的大脑包裹起来,只更换了href标签的内部部分。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

您无法使用RegEx完全解析HTML,但您可以使用HTML解析器,只需用正则表达式解析并替换锚标记的href属性。

以下规格是相关的:

  

a和area元素的href属性必须具有a的值   可能由空格包围的有效URL。   ...

     

字符串是一个有效的URL,如果在之后,可能被空格包围   从中剥离前导和尾随空格,它是一个有效的URL。   ...

     

如果URL符合创作一致性,则URL是有效的URL   WHATWG URL规范中的要求。 [URL]

请参阅http://w3c.github.io/html/single-page.html#valid-url

  

绝对URL字符串必须是一个URL方案字符串,它是对特殊方案的ASCII不区分大小写的匹配,而不是对“file”的ASCII不区分大小写的匹配,后跟U + 003A (:)和scheme-relative-special-URL string ...

请参阅https://url.spec.what

强大的正则表达式因此必须不区分大小写并接受空格:

let href = " MailTO:bob@example.com  ";
let result = href.replace(/^\s*mailto:.*$/i, "&lt;%='$&'%&gt;");
console.log(result);

虽然您也可以使用正则表达式解析锚元素属性,但您需要一个HTML解析器来查找HTML文档中的锚元素。既然你需要一个HTML解析器,你也可以依靠它来提取锚元素及其href属性。