2017-11-04 8 views
0

Ich versuche, HLS m3u8 Datei zu analysieren und wo am stecken ist entspricht m3u8 Links. Also, wenn URI= existiert, von #EXT-X-I-FRAME-STREAM-INF, greifen Sie das eine in Anführungszeichen, und wenn es nicht, #EXT-X-STREAM-INF, greifen Sie den Link aus der neuen Zeile.Parsing HLS m3u8 Regex

Text:

#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 

enter image description here

Regex:

(?:#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

+1

Bitte beachten Sie [diese Demo] (https://regex101.com/r/lOwJGk/3), tun yo Willst du so etwas? Ordne eine zusätzliche Zeile zu und fange sie in der zweiten 'URI'-Gruppe (mit' (? J) ') ein, wenn' # EXT-X-STREAM-INF' in Gruppe 1 gefunden wurde. –

+0

@Wiktor Stribiżew Du bist jenseits von Gott! Bitte machen Sie einen Beitrag, damit ich abstimmen und als Antwort akzeptieren kann. –

+0

Sind Sie sicher, dass Ihr Motor PCRE ist?Wird es im aktuellen Projektcode funktionieren? –

Antwort

1

Eine schnelle Lösung für Ihr Muster wird wie folgt aussehen:

  • Capture the #EXT-X-STREAM-INF Teil in Gruppe 1
  • hinzufügen (?J) Modifier einfangenden Gruppen mit identischen Namen hinzufügen
  • zu ermöglichen, ein conditional construct, die die ganze Zeile nach den aktuellen Mustern erfassen, wenn Gruppe 1 abgestimmt.

Das Muster

(?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)+)) 

die So regex demo

aussehen wird sehen, hinzugefügt im Grunde, ich (?<URI>(?:(?!#EXT)\S)+)) am Ende und gefangen (#EXT-X-STREAM-INF) am Start.

Die bedingte Konstrukt passt wie folgt aus:

  • (? - Start des bedingten Konstrukt
    • (1) - wenn 1 Gruppe
    • abgestimmt
    • \R - ein Zeilenumbruch
    • (?<URI> - Beginn eine benannte einfangende Gruppe
      • (?:(?!#EXT)\S)+) - jedes nicht-Leerzeichen char (\S), 1 oder mehrere Vorkommen (+), das heißt keinen Ausgang char eine #EXT char Sequenz (die sogenannten "tempered greedy token")
    • ) - Ende der benannten Erfassungsgruppe
  • ) - Ende des bedingten Konstrukt
+0

Das einzige, was mir Sorgen bereitet, ist, ob # EXT-X-STREAM-INF und # EXT-X-I-FRAME-STREAM-INF in derselben Zeile stehen. # EXT-X-STREAM-INF: BANDBREITE = 263.851 ... # EXT-XI-FRAME-STREAM-INF: URI = "GEAR1/... –

+0

prüfen https://regex101.com/r/kleKNs/1 –

+0

geändert von bis '((1) \ R ( [^ # EXT \ s] +)?)' ​​und es funktioniert wie ein Charme https '((1) \ R ( *)?.)'.: //regex101.com/r/9OPleo/2 Nochmals vielen Dank. –