我想编写一个Javascript函数来替换包含mailto链接的href标记。
<a href="mailto:foo@bar.com">Email me</a>!
应该成为:
<a href="<%='mailto:foo@bar.com'%>">Email me</a>!
这适用于将HTML提供给第三方服务的应用程序,并且该服务因为它不接受mailto URL而被破坏,但如果我们将其作为变量进行掩码,它将接受它。我只是很难将非正则表达式友好的大脑包裹起来,只更换了href标签的内部部分。
非常感谢你的帮助!
答案 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 ...
强大的正则表达式因此必须不区分大小写并接受空格:
let href = " MailTO:bob@example.com ";
let result = href.replace(/^\s*mailto:.*$/i, "<%='$&'%>");
console.log(result);
虽然您也可以使用正则表达式解析锚元素属性,但您需要一个HTML解析器来查找HTML文档中的锚元素。既然你需要一个HTML解析器,你也可以依靠它来提取锚元素及其href属性。