【问题标题】:Capturing header and continue matching - Regex捕获标头并继续匹配 - 正则表达式
【发布时间】:2017-11-12 18:58:38
【问题描述】:

如果标头存在,如何捕获标头#EXTM3U 并继续匹配#EXTINF 模式。

#EXTM3U
#EXTINF:10.0,
media_w854021192_21533.ts
#EXTINF:10.0,
media_w854021192_21534.ts
#EXTINF:10.0,
media_w854021192_21535.ts

正则表达式:

(?<HEADER>#EXTM3U)\r?\n(?:#EXTINF:(?<DURATION>\-?\d+\.?\d+),(?<TITLE>.+)?\r?\n(?<URI>\S+))

Regex demo

正则表达式结果应如下所示:

【问题讨论】:

  • 试试regex101.com/r/lPZSg4/1。请注意,后续的 EXTINF 块作为单独的匹配项进行匹配。
  • @Wiktor Stribiżew Man...谢谢!
  • 你在 PHP 中使用它吗?
  • @Wiktor Stribiżew 我正在使用 PHP。
  • ideone.com/N4xmv4 会产生预期的结果吗?

标签: regex m3u8


【解决方案1】:

您可以将以下正则表达式与preg_match_all 一起使用:

'~(?<HEADER>#EXTM3U|\G(?!\A))\R\K#EXTINF:(?<DURATION>-?\d+\.?\d+),(?<TITLE>.+)?\R(?<URI>\S+)~'

regex demo

详情'

  • (?&lt;HEADER&gt;#EXTM3U|\G(?!\A)) - HEADER 组匹配 #EXTM3U 或上一场比赛的结束 (\G(?!\A))
  • \R - 换行符
  • \K - 匹配重置运算符丢弃目前匹配的文本
  • #EXTINF: - 一个子字符串
  • (?&lt;DURATION&gt;-?\d+\.?\d+) - DURATION 组匹配可选的-、1+ 位、可选的. 和 1+ 位
  • , - 逗号
  • (?&lt;TITLE&gt;.+)? - 一个可选的 TITLE 组匹配 1+ 个字符而不是换行符,尽可能多
  • \R - 换行
  • (?&lt;URI&gt;\S+) - 一个匹配 1 个或多个非空白字符的 URI 组。

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多