如何解析 YouTube 网址?

Hen*_*dré 3 youtube regex url

我如何只提取

http://www.youtube.com/watch?v=qdRaf3-OEh4
Run Code Online (Sandbox Code Playgroud)

从一个 URL 像

http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main
Run Code Online (Sandbox Code Playgroud)

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

Run*_*ium 14

更新:

更好的是:

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

RFC 3986规定:

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

   查询 = *( pchar / "/" / "?" )
   片段 = *( pchar / "/" / "?" )

   pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
   未保留 = ALPHA / DIGIT / "-" / "." / "_" / "~"
   子delims =“!” / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="
   …

所以为了安全使用:

 | sed 's/#.*//' | - to remove #fragment part
Run Code Online (Sandbox Code Playgroud)

在前。

IE

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

SED (2):

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

解释:

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

'替换/匹配 0 或更多的东西并将它们分组在 ()/WITH THIS/

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

         [abc] 将匹配 a OR b OR c
         [abc]* 将匹配 a AND/OR b AND/OR c - 尽可能多次
         [^abc] 将匹配任何但 a,b 或 c

/\1/ 用 MATCH GROUP 编号 1 替换整个匹配项。
         那将是 - \( 和 \) 之间的所有内容 - 除了“&”之外他什么都没有
         在文字字符串“v=”之后 - 它又包含一个非单词字母 
         它的前面。

         这也意味着没有匹配意味着没有替换,最终导致 
         没变。

结果: qdRaf3-OEh4

注意:如果没有匹配将返回整个字符串。


(G)AWK:

回声'http://www.youtube.com/watch?v=qdRaf3-OEh4&playnext=1&list=PL4367CEDBC117AEC6&feature=results_main' \
| awk 'match($0,/(\Wv=)([^&]*)/,v){打印 v[2]}'

结果: qdRaf3-OEh4

解释:

在 Awk 中match(string, regexp)是一个函数,它在字符串中搜索最长、最左边的正则表达式匹配项。这里我使用了 Gawk 自带的一个扩展。(参见AwkGAwk; MAwk 等)将单个匹配项 - 即:括号之间的内容 - 放在匹配数组中。

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

  +-------------------------------------- 内置功能
  | +--------------------------------- 整个输入($1 将被提交 1)
  | | 等(使用默认分隔符“”*)
  | |
  | |
  | | (..)(....) ------------------ 将 \Wv= 放在第 1 组中,将 [^&]* 放在第 2 组中。
match($0, /(\Wv=)([^&]*)/, v){打印 v[2]}
                           | | | |
                           | | ++---- 使用来自 /, v 的 "v"; v 是用户定义的名称
                           | | +---- 2 指定 v 中的索引,即 group from
                           | | /…/ 中的 () 之间是什么
                           | |
                           | +----------- 打印是另一个内置函数。
                           +-------------- 可用于打印的组名。
                              



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 中使用“&”,这应该没问题。