如何解析 YouTube URL?

如何解析 YouTube URL?

我如何只提取

http://www.youtube.com/watch?v=qdRaf3-OEh4

来自类似

http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main

我只对“v”参数感兴趣。

答案1

更新:

更好的是:

sed's/^.\+\(\/\|\&\|\?\)v=\([^\&]*\).*/\2/'
awk'匹配($0,/((\/|&|\?)v=)([^&]*)/,x){print x[3]}'
grep -Po'(?<=(\/|&|\?)v=)[^&]*'
# 说匹配 / 或 & 然后 v=

RFC 3986状态:

   URI = 方案“:” hier-part [“?”查询] [“#”片段]

   查询 = *(pchar /“/”/“?”)
   片段 = *(pchar/“/”/“?”)

   pchar = 未保留 / pct 编码 / 子分隔符 /“:” /“@”
   未保留 = ALPHA / DIGIT /“-” /“。” /“_” /“~”
   子分隔符 = “!”/“$”/“&”/“'”/“(”/“)”
                 /“*”/“+”/“,”/“;” / "="

因此为了安全使用:

 | sed 's/#.*//' | - to remove #fragment part

在前。

IE

| sed 's/#.*//' | grep -Po '(?<=(\/|&)v=)[^&]*'

独立经济专家 (2):

回显'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' \
| sed's/^.\+\Wv=\([^\&]*\).*/\1/'

解释:


/…/…/ /这个/和这个/

'替换/匹配 0 个或更多项并将它们分组到 ()/用这个/

+-------------------------- s _s_ubsititute
|+------------------------- / 开始比赛
|| +---- / 结束比赛
|| | +-- \1 替换为 - \1==Group 1。或 FIRS 低()。
|| | | +- / SUBSTITUTE 结束
s/^.\+\Wv=\([^\&]*\).*/\1/'
  +++-+-+-+-+-----+-+------- ^ 从行首匹配
   ++-+-+-+-+-----+-+------- . 匹配任意字符
    +-+-+-+-+-----+-+------- \+ 多次 (grep (greedy +, * *? 等))
      +-+-+-+-----+-+------- \W 非单词字符
        +-+-+-----+-+------- v= 字面匹配“v=”
          +-+-----+-+------- \(开始匹配组
            +-----+-+------- [^\&]* 匹配任意字符,但 & 除外 - 尽可能多
                  +-+------- \) 结束匹配组
                    +------- .* 匹配任意内容;*尽可能多次
                                      - 又称到行尾;因为没有

         [abc] 将匹配 a 或 b 或 c
         [abc]* 将尽可能多次匹配 a AND/OR b AND/OR c
         [^abc] 匹配除 a、b 或 c 之外的任何内容

/\1/ 将整个匹配项替换为匹配组 1。
         那将是 - \( 和 \) 之间的所有内容 - 除了“&”
         在字符串“v=”之后——其中又有一个非单词字母
         在它的前面。

         这也意味着没有比赛就不能换人,最终导致
         不用找了。

结果:qdRaf3-OEh4

注意:如果没有匹配全部的将返回字符串。


(G)AWK:

回显'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' \
| awk ‘匹配($0,/(\Wv=)([^&]*)/,v){print v[2]}’

结果:qdRaf3-OEh4

解释:

在 Awk 中match(string, regexp)有一个函数用于搜索字符串中最长、最左边的正则表达式匹配项。这里我使用了 Gawk 附带的一个扩展。(请参阅awk 的韋克;MAwk 等)将各个匹配项(即括号之间的内容)放置在匹配项数组中。

该模式与下面的 Perl/Grep 模式非常相似。

  +----------------------------------------- 内置函数
  | +--------------------------------- 全部输入($1 将被归档为 1)
  | | 等(使用默认分隔符“ “*)
  | |
  | |
  | | (....)(....) ------------------ 将 \Wv= 放在第 1 组,将 [^&]* 放在第 2 组。
匹配($0,/(\Wv=)([^&]*)/,v){打印 v[2]}
                           | | | |
                           | | +-+---- 使用 /,v 中的“v”;v 是用户定义的名称
                           | | +---- 2 指定 v 中的索引,它是来自的组
                           | | /…/ 中 () 之间是什么
                           | |
                           | +----------- 打印是另一个内置函数。
                           +--------------- 可在打印中使用的组名。
                              



GREP(使用 Perl 兼容):

回声'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' | \
grep -Po'(?<=\Wv=)[^&]*'

结果:qdRaf3-OEh4

解释:

-P 使用 Perl 兼容
-o 仅打印表达式的匹配。
    - 这意味着:我们的模式只打印/返回与它匹配的内容。
    如果没有匹配项,则不返回任何内容。

          +------- ^ 取反数学为 - 不匹配(仅因为它是 [] 之间的第一个)
          |+------ & 文字“&”字符
          ||
(?<=\Wv=)[^&]*
| | | | ||
| | | | |+---- * 贪婪;尽可能多地执行。
| | | +--+----- [] 狂野秩序/内部任意顺序 []
| | +----------- v= 文字 v=
| +------------- \W 非单词字符
+----------------- (?<= 后面的内容应该(立即)放在之前。
                    ?=嗯,<=左,= =等于

因此:匹配文字“v=”,其中“v”前面有一个非单词字符。然后匹配
任何内容;尽可能多次,直到我们到达行尾或遇到“&”。

由于在 URL 中的键/值对之间不能有“&”,所以这应该没问题。

答案2

echo 'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' | sed -e 's/&.*//' -e 's/.*watch?//'

会得到你v=qdRaf3-OEh4

相关内容