正则表达式在<a> deleting hashtags posted before

时间:2017-09-24 11:11:18

标签: javascript regex youtube

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_;-]+)?(&amp;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)

1 个答案:

答案 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