繁体   English   中英

RegEx用于提取锚标记中的内部链接并向其中添加一些内容

[英]RegEx for extracting internal link in anchor tag and append something into it

我使用Nuxt.js开发了一个服务器端渲染博客,我想添加该站点的AMP版本。 如果常规页面的URL为https://example.com/blog/internal-link ,则AMP版本将为https://example.com/amp/blog/internal-link

如果有人打开AMP版本,我应该在所有内部链接之前附加/amp前缀,然后将其发送给客户端。

我有这个正则表达式<a([^>]*?)href\\s*=\\s*(['"])([^\\2]*?)\\2\\1*>来提取href值锚标记的

然后我想出了这个脚本:

 const regex = /<a([^>]*?)href\\s*=\\s*(['"])([^\\2]*?)\\2\\1*>/gi; const str = `<a href="/blog/internal-link" aria-label="Internal Link" class="blog__link">`; const subst = `<a href="/amp$3>`; const result = str.replace(regex, subst); console.log(result); 

但是上面的正则表达式提取了所有href值,包括外部和内部链接。 假设内部链接始终像/blog/internal-link一样,如何使RegEx只匹配/blog/internal-link

因此,基于该场景,输入和预期输出应如下所示:

输入: <a href="/blog/internal-link" aria-label="Internal Link" class="blog__link">

输出: <a href="/amp/blog/internal-link" aria-label="Internal Link" class="blog__link">

输入: <a href="https://example.com/blog/internal-link" aria-label="Internal Link" class="blog__link">

输出: <a href="https://example.com/blog/internal-link" aria-label="Internal Link" class="blog__link">


更新

感谢您帮助我解决此问题。 我最终使用了此RegEx <a([^>]*?)href\\s*=\\s*(['"])(\\/[^\\2]*?)\\2\\1*> 。需要在[^2]*?之前添加\\/来过滤内部链接。

这是我问题的最终结果的最小复制:

 const html = ` <html> <head> <title>Hello World</title> </head> <body> <a href="/blog/internal-link" aria-label="Internal Link" class="blog__link">Internal Link</a> <a href="https://example.com/blog/external-link" aria-label="External Link" class="blog__link">External Link</a> </body> </html>` const regex = /<a([^>]*?)href\\s*=\\s*(['"])(\\/[^\\2]*?)\\2\\1*>/gi; const result = html.replace(regex, `<a href="/amp$3">`); console.log(result) 

您可以通过确保/blog/internal-link是您的正则表达式的一部分来解决此问题:

 const regex = /<a([^>]*?)href\\s*=\\s*(['"])([\\s\\S]*)\\/blog\\/([\\s\\S]*)([^\\2]*?)\\2\\1*>/gi; const str = `<a href="https://example.com/blog/internal-link" aria-label="Internal Link" class="blog__link">`; const subst = `<a href="$3/blog/amp/$4>`; const result = str.replace(regex, subst); console.log(result); 

您可以使用URL类:

const href = str.match(/<a([^>]*?)href\s*=\s*(['"])([^\2]*?)\2\1*>/gi)[0]
const url = new URL(href, "http://example.com")
url.pathname = "/amp"+url.pathname

const newUrl = url.toString()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM