【问题标题】:Parsing HLS m3u8 Regex解析 HLS m3u8 正则表达式
【发布时间】:2018-04-17 06:43:24
【问题描述】:

我正在尝试解析 HLS m3u8 文件并且卡在匹配 m3u8 链接的位置。因此,如果URI= 存在,则从#EXT-X-I-FRAME-STREAM-INF 中获取引号中的那个,如果不存在#EXT-X-STREAM-INF,则从新行获取链接。

文字:

#EXT-X-STREAM-INF:BANDWIDTH=263851,CODECS="mp4a.40.2, avc1.4d400d",RESOLUTION=416x234,AUDIO="bipbop_audio",SUBTITLES="subs"
gear1/prog_index.m3u8 <== new line link
#EXT-X-I-FRAME-STREAM-INF:URI="gear1/iframe_index.m3u8",CODECS="avc1.4d400d",BANDWIDTH=28451

正则表达式:

(?:#EXT-X-STREAM-INF:|#EXT-X-I-FRAME-STREAM-INF:)(?:BANDWIDTH=(?<BANDWIDTH>\d+),?|CODECS=(?<CODECS>"[^"]*"),?|RESOLUTION=(?<RESOLUTION>\d+x\d+),?|AUDIO=(?<AUDIO>"[^"]*"),?|SUBTITLES=(?<SUBTITLES>"[^"]*"),?|URI=(?<URI>"[^"]*"),?)*

Regex demo

【问题讨论】:

  • 请看this demo,你想要这样的东西吗?如果 #EXT-X-STREAM-INF 在第 1 组中匹配,则匹配另一行并将其捕获到第二个 URI 组(使用 (?J) 修饰符)。
  • @Wiktor Stribiżew 你简直太神了!请发帖,这样我就可以投票并接受它作为答案。
  • 您确定您的引擎是 PCRE 吗?它会在实际的当前项目代码中工作吗?
  • @Wiktor Stribiżew 我不知道。我正在使用 PHP。
  • 是的,PHP 使用 PCRE。

标签: regex http-live-streaming m3u8


【解决方案1】:

您的模式的快速修复将如下所示:

  • #EXT-X-STREAM-INF 部分捕获到第 1 组中
  • 添加(?J)修饰符以允许具有相同名称的命名捕获组
  • 添加一个conditional construct,如果第 1 组匹配,它将捕获当前模式之后的整行。

图案看起来像

(?J)(?:(#EXT-X-STREAM-INF)|#EXT-X-I-FRAME-STREAM-INF):(?:BANDWIDTH=(?<BANDWIDTH>\d+),?|CODECS=(?<CODECS>"[^"]*"),?|RESOLUTION=(?<RESOLUTION>\d+x\d+),?|AUDIO=(?<AUDIO>"[^"]*"),?|SUBTITLES=(?<SUBTITLES>"[^"]*"),?|URI=(?<URI>"[^"]*"),?)*(?<URI>(?:(?!#EXT)\S)+))

regex demo

所以,基本上,我在末尾添加了(?&lt;URI&gt;(?:(?!#EXT)\S)+)),并在开头捕获了(#EXT-X-STREAM-INF)

条件结构匹配如下:

  • (? - 条件构造的开始
    • (1) - 如果第 1 组匹配
    • \R - 换行
    • (?&lt;URI&gt; - 命名捕获组的开始
      • (?:(?!#EXT)\S)+) - 任何非空白字符 (\S),出现 1 次或多次 (+),它不是 #EXT 字符序列的起始字符(所谓的 "tempered greedy token"
    • ) - 命名捕获组结束
  • ) - 条件结构结束

【讨论】:

  • 我唯一关心的是#EXT-X-STREAM-INF 和#EXT-X-I-FRAME-STREAM-INF 是否在同一行。 #EXT-X-STREAM-INF:BANDWIDTH=263851...#EXT-X-I-FRAME-STREAM-INF:URI="gear1/...
  • 从 '(?(1)\R(?.*))' 更改为 '(?(1)\R(?[^#EXT\s]+ ))',它就像一个魅力。 regex101.com/r/9OPleo/2 再次感谢您。
  • @S.Kablar 抱歉,我离线了。您不能使用否定字符类来匹配除字符序列之外的任何文本。您可以使用经过调和的贪婪令牌(?&lt;URI&gt;(?:(?!#EXT)\S)+))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 2011-03-20
  • 2012-07-08
  • 2010-10-23
  • 2017-07-10
相关资源
最近更新 更多