【问题标题】:YouTube Regex: Tested to pick up both video and playlist ID, yet Node.js won'tYouTube 正则表达式:经过测试可以同时获取视频和播放列表 ID,但 Node.js 不会
【发布时间】:2014-12-14 05:25:09
【问题描述】:

我有以下正则表达式,它已经在三个不同的网站上进行了测试,以匹配所有 YouTube 链接,并捕获视频 ID 和可选的播放列表 ID。尽管如此,我的 Node 应用程序除了视频 ID 之外什么都没有接收到:

/(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((?:\w|-|_){11})(?:(?:\?|\&)index=((?:\d){1,3}))?(?:(?:\?|\&)list=((?:\w|-|_){24}))?(?:\S+)?/g

Debuggex Demo

我的实际代码:

var youtube = /(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((?:\w|-|_){11})(?:(?:\?|\&)index=((?:\d){1,3}))?(?:(?:\?|\&)list=((?:\w|-|_){24}))?(?:\S+)?/g;
ansCopy = ansCopy.replace(youtube, "^~$1~^~$3~^");

使用“http://www.youtube.com/watch?v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46”作为测试字符串,这应该会产生字符串:

"^~VWKdcalZTaA~^~UUlucBMqhrYW4PWuIp8Um_cg~^"

但它反而会产生:

"^~VWKdcalZTaA~^~~^"

【问题讨论】:

    标签: javascript regex node.js hyperlink youtube


    【解决方案1】:

    这是一个 URL,所以为什么不使用 Node.js URL 模块。

    var url = require('url');
    var youtube = url.parse('http://www.youtube.com/watch?v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46');
    /*{
        protocol: 'http:',
        slashes: true,
        auth: null,
        host: 'www.youtube.com',
        port: null,
        hostname: 'www.youtube.com',
        hash: null,
        search: '?v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46',
        query: 'v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46',
        pathname: '/watch',
        path: '/watch?v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46',
        href: 'http://www.youtube.com/watch?v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46'
    }*/
    var query = querystring.parse(youtube.query); 
    /*{
        v: 'VWKdcalZTaA',
        list: 'UUlucBMqhrYW4PWuIp8Um_cg',
        index: '46'
    }*/
    

    【讨论】:

    • 真的那么简单吗...?你从哪里得到查询字符串?
    • 查询字符串也由 Node.js 提供,nodejs.org/api/querystring.html
    • 所以我发现了正则表达式没有正确识别的原因。我的代码正在解析 URL 中的所有 &。
    • 如果可以,我会尽量避免使用 RegEx。
    • 我明白了原因,但我的一个朋友一直在疯狂地推动正则表达式,我碰巧找到了“终极”YouTube 链接正则表达式,然后我对其进行了改进。长话短说,一些清理代码一直干扰链接。我添加了对 HTML 符号“&”的可选检测,所以它现在可以工作了。
    【解决方案2】:

    事实证明,正则表达式没有正确获取播放列表 ID,因为一些卫生代码会将第一个“&”替换为其对应的 HTML 表示法,干扰正则表达式并仅返回与视频 ID 匹配的内容.我的正则表达式现在同时接受“&”和“& #38;”必要时:

    (?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+(?:&|&);v=))((?:\w|-|_){11})(?:(?:\?|&|&)index=((?:\d){1,3}))?(?:(?:\?|&|&)list=((?:\w|-|_){24}))?(?:\S+)?
    

    Debuggex Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 2018-07-08
      • 2011-04-08
      • 2013-09-12
      • 1970-01-01
      • 2015-07-23
      • 2020-12-21
      相关资源
      最近更新 更多