Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 解析HLS m3u8正则表达式_Regex_Http Live Streaming_M3u8 - Fatal编程技术网

Regex 解析HLS m3u8正则表达式

Regex 解析HLS m3u8正则表达式,regex,http-live-streaming,m3u8,Regex,Http Live Streaming,M3u8,我正在尝试解析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”,分辨率=416x234,AUDIO=“bipbop\u AUDIO”,SUBTITLES=“subs” gear1/prog_

我正在尝试解析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”,分辨率=416x234,AUDIO=“bipbop\u AUDIO”,SUBTITLES=“subs”

gear1/prog_index.m3u8模式的快速修复程序如下所示:

  • #EXT-X-STREAM-INF
    部分捕获到组1中
  • 添加
    (?J)
    修饰符以允许使用相同名称的命名捕获组
  • 如果组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)+))
(?)(?:(#EXT-X-STREAM-INF)| EXT-X-I-FRAME-STREAM-INF):(?:带宽=(?\d+),|编解码器=(?“[^”]*”,|分辨率=(?\d+X\d+),|音频=(?)

因此,基本上,我在末尾添加了
(?(?:(?!#EXT)\S)+
,并在开头捕获了
(#EXT-X-STREAM-INF)

条件构造匹配如下所示:

  • (?
    -条件构造的开始
    • (1)
      -如果组1匹配
    • \R
      -换行符
    • (?
      -启动命名捕获组
      • (?:(?!#EXT)\S)+
        -任何非空白字符(
        \S
        ),一次或多次出现(
        ++
        ),这不是
        \EXT
        字符序列(所谓的)的起始字符
    • -命名捕获组的结尾
  • -条件构造的结束

请看,您想要这样的东西吗?匹配一个额外的行并将其捕获到第二个
URI
组中(使用
(?J)
修饰符)如果第1组中匹配了
#EXT-X-STREAM-INF
。@Wiktor Stribiżew你真是超乎上帝!请发一篇帖子,这样我就可以投票并接受它作为答案。你确定你的引擎是PCRE吗?它在实际的当前项目代码中能工作吗?@Wiktor Stribiżew我不知道。我在使用PHP。是的,PHP使用PCRE。我唯一关心的是如果#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]+)”),它就像一个符咒。再次感谢。@S.Kablar抱歉,我离线了。除了字符序列外,不能使用求反字符类来匹配任何文本。您可以使用一个标记。
(?:#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>"[^"]*"),?)*
(?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)+))