I'm currently working on a project which require to convert a youtube link to an iframe in a Post. My regex can do that.
However, before doing this, I have a few plugins that transform hashtags # in and same with links like http://blablabla.bla
中找到您的链接我的问题是我的正则表达式会转换在youtube视频之前发布的每个标签并将其删除。我认为它来自。*在我的正则表达式的开始,但我不是很确定。我真的不知道如何解决这个问题......
这是我在regex101中的正则表达式。但是hashtag链接不包含在完整匹配中,所以现在我不确定任何东西......
https://regex101.com/r/Myuyoq/3
任何帮助,线索或建议赞赏:)
PS:这是我的代码,如果它可以帮助理解更好......
const postContent = brify(hashtagify(linkify(usedPost.content || '', {
className: 'linkified',
defaultProtocol: 'https',
target: {
url: '_blank'
}
})))
const re = /(<a .*(?:https?:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=)?([a-zA-Z0-9_;-]+)?(&list=[a-zA-Z0-9_;-]*)*<\/a>)/g,
vid = '<iframe width="551" height="345" src="https://www.youtube.com/embed/$2" frameborder="0" allowfullscreen></iframe>';
const contentYoutube = postContent.replace(re, vid)
答案 0 :(得分:0)
.*
会使你的正则表达式与第一个<a
匹配,然后吃掉所有内容,直到最后的</a>
前面有所需的href
。要解决此问题,请将.
更改为[^<]
以从匹配项中排除任何其他标记:
(<a [^<]*(?:http:\/\/|https:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=)?([a-zA-Z0-9_;-]+)<\/a>)
^^^^
Use this instead of .
演示:https://regex101.com/r/Myuyoq/5
P.S。
您未能在regex101.com示例中显示错误,因为a
标记位于单独的行且.
与新行字符不匹配。您可以将a
标记放在同一行上以演示预期内容:
https://regex101.com/r/Myuyoq/4