[英]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.