【发布时间】:2019-10-11 20:05:08
【问题描述】:
我一直在尝试找出一种解决方案,将链接前面没有 http:// 或 https:// 的所有 href 替换为附有 http:// 的链接版本。
目前我有这样的事情:
static correctUrls(input: string): string {
// get all hrefs from the input
let urls = input.match('<a[^>]* href="([^"]*)"/g');
// if no urls return original input
if (!urls) {
return input;
}
// remove duplicate urls
urls = urls.filter((item, pos) => {
return urls.indexOf(item) === pos;
});
// if no urls in input
if (!urls) {
return input;
}
for (const url of urls) {
// if url does not have https
// tslint:disable-next-line: max-line-length
if (!url.match('^ (http: \/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$')) {
input = input.replace(url, 'https://' + url);
}
}
return input;
}
任何帮助将不胜感激。请说明您的答案的正则表达式如何工作。我发现了很多与此类似的问题,但是对于我找到的所有解决方案,当我尝试执行 input.match 时,它会返回匹配的 href 两次(如果有的话),但如果有两个 @ 987654325@s 然后它返回垃圾。
这是输入:
<p> We love
<a href="https://google.com"
rel="noopener noreferrer"
target="_blank">Google</a>
and
<a href="Facebook.com"
rel="noopener noreferrer"
target="_blank">Facebook</a>.
</p>
以及预期的输出:
<p> We love
<a href="https://google.com"
rel="noopener noreferrer"
target="_blank">Google</a>
and
<a href="https://Facebook.com"
rel="noopener noreferrer"
target="_blank">Facebook</a>.
</p>
【问题讨论】:
-
不要使用正则表达式解析出 HTML。使用 DOM 查找锚标记及其
href属性和URL类来解析它们。 -
我正在使用 Angular,将尝试创建一个新的 HtmlElement() 并将 .innerHtml 设置为输入并以这种方式导航 DOM。
-
如果您将 HTML 作为字符串,您可以使用 DOM 对其进行解析,而无需实际将其添加到页面中。 developer.mozilla.org/en-US/docs/Web/API/DOMParser 代替。
-
@Amy 谢谢你对我的帮助。
标签: javascript regex angular typescript