Php Curl解析m3u文件

时间:2017-01-24 05:33:49

标签: php curl video

希望你们能帮助我。我有以下.m3u文件

#EXTM3U
#EXTINF:-1 tvg-id="" tvg-name="A&E" tvg-logo="" group-title="ENTRETENIMIENTO",A&E
http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts
#EXTINF:-1 tvg-id="" tvg-name="ABC Puerto Rico" tvg-logo="" group-title="NACIONALES",ABC Puerto Rico
http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/96.ts
#EXTINF:-1 tvg-id="" tvg-name="Animal Planet" tvg-logo="" group-title="ENTRETENIMIENTO",Animal Planet
http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/185.ts

如您所见,该文件的主标记 #EXTM3U ,向下启动视频信息标记(#EXTINF:-1 ...),然后关闭视频链接条目(http://。 ....)

你能明确告诉我如何解析整个文件(它是一个非常大的文件)并将字段保存在数组中,例如像这样? 视频[] 然后我可以访问每个视频属性,让我们说视频[0] ['标题'] 获取第一个视频的标题?以及其他属性,例如视频[42] ['链接'] ,并获取视频#42的链接。

我已经在使用curl将文件内容转换为像这样的变量

<?php
   $handler = curl_init("link to m3u file");  
   $response = curl_exec ($handler);  
   curl_close($handler); 
   echo $response;
?>

我现在需要的是解析Curl响应并将所有视频信息保存到一个数组中,我可以在其中访问每个视频的每个属性。

我知道我必须使用一些正则表达式或类似的东西。我只是不明白如何。你可以帮我一些代码吗?非常感谢你。

3 个答案:

答案 0 :(得分:2)

看看Regx的魔力

$string = <<<CUT
#EXTM3U
#EXTINF:-1 tvg-id="" tvg-name="A&E" tvg-logo="" group-title="ENTRETENIMIENTO",A&E`http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts
http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts
#EXTINF:-1 tvg-id="" tvg-name="ABC Puerto Rico" tvg-logo="" group-title="NACIONALES",ABC Puerto Rico
http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/96.ts
CUT;

preg_match_all('/(?P<tag>#EXTINF:-1)|(?:(?P<prop_key>[-a-z]+)=\"(?P<prop_val>[^"]+)")|(?<something>,[^\r\n]+)|(?<url>http[^\s]+)/', $string, $match );

$count = count( $match[0] );

$result = [];
$index = -1;

for( $i =0; $i < $count; $i++ ){
    $item = $match[0][$i];

    if( !empty($match['tag'][$i])){
        //is a tag increment the result index
        ++$index;
    }elseif( !empty($match['prop_key'][$i])){
        //is a prop - split item
        $result[$index][$match['prop_key'][$i]] = $match['prop_val'][$i];
    }elseif( !empty($match['something'][$i])){
        //is a prop - split item
        $result[$index]['something'] = $item;
    }elseif( !empty($match['url'][$i])){
        $result[$index]['url'] = $item ;
    }
}

print_r( $result );

<强>返回

array (
  0 => 
  array (
    'tvg-name' => 'A&E',
    'group-title' => 'ENTRETENIMIENTO',
    'something' => ',A&E`http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts',
    'url' => 'http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts',
  ),
  1 => 
  array (
    'tvg-name' => 'ABC Puerto Rico',
    'group-title' => 'NACIONALES',
    'something' => ',ABC Puerto Rico',
    'url' => 'http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/96.ts',
  ),
)

说真的,虽然我不知道其中一些是something例如。无论如何应该让你开始。

对于regx来说,它真的很简单,当它被分解时。真正的诀窍是使用preg_match_all而不是preg_match

这是我们的regx

 /(?P<tag>#EXTINF:-1)|(?:(?P<prop_key>[-a-z]+)=\"(?P<prop_val>[^"]+)")|(?<something>,[^\r\n]+)|(?<url>http[^\s]+)/

首先,我们将其分解为更易于管理的位。它们由管道|分隔,用于或。每一个都可以被认为是一个单独的模式,匹配这个或下一个。现在,订单可能很重要,因为它们将从左到右匹配,因此如果一个匹配在左边,它就会停止。所以你必须要小心,不要在两个地方有一个匹配的regx(如果你不想要那个)。但是,它也可以用于您的优势,我将在下面展示。这正是我们正在处理的问题

 (?P<tag>#EXTINF:-1)

 (?:(?P<prop_key>[-a-z]+)=\"(?P<prop_val>[^"]+)")

 (?<something>,[^\r\n]+)

 (?<url>http[^\s]+)

四个正则表达式。对于所有这些(?P<name>...)是一个命名的捕获组,它只是使它更易读,更容易找到位。如果你查看我用来查找匹配项的条件,例如!empty($match['tag'][$i]),我们可以使用tag索引/键,因为命名的捕获组,否则它将是1。如果您认为这实际上是嵌套的,1 2 3可能会变得混乱,那么对于标记等来说$match[1][$i]就会变得混乱。无论如何,只有一次我们已经拿出了

  • #EXTINF:-1字面上匹配此字符串
  • (?:(?P<prop_key>[-a-z]+)=\"(?P<prop_val>[^"]+)")这是更复杂的(?: .. )是一个非捕获组,这是因为键/数值与匹配数组中的相同索引结束但未捕获togather,分解为([-a-z]+)=\"([^"]+)\"或匹配后跟=然后"的字词,而不是""结尾的字词。基本上一方捕获密钥,另一方除去双引号
  • ,[^\r\n]+以逗号开头,然后以行返回
  • 和最后http[^\s]个网址

现在记住我所说的有关重要的顺序,这个网址http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts会匹配最后一个表达式,除了它以,A&E http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts`开头,它与第三个匹配,所以它永远不会得到4号

希望有帮助,授予你必须掌握Regx的基本知识,这不是真正的完整教程的地方,你可以找到更好的例子,然后我可以在短短的几分钟内提供

为了完整起见,这是preg_match_all返回

的一部分
(
    [0] => Array(
            [0] => #EXTINF:-1
            [1] => tvg-name="A&E"
            [2] => group-title="ENTRETENIMIENTO"
            [3] => ,A&E`http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts
            [4] => http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/76.ts
            [5] => #EXTINF:-1
            [6] => tvg-name="ABC Puerto Rico"
            [7] => group-title="NACIONALES"
            [8] => ,ABC Puerto Rico
            [9] => http://nxtv.tk:8080/live/jarenas/iDKZrC56xZ/96.ts
        )
    [tag] => Array(
            [0] => #EXTINF:-1
            [1] => 
            [2] => 
            [3] => 
            [4] => 
            [5] => #EXTINF:-1
            [6] => 
            [7] => 
            [8] => 
            [9] => 
        )
    [1] => Array(
            [0] => #EXTINF:-1
            [1] => 
            [2] => 
            [3] => 
            [4] => 
            [5] => #EXTINF:-1
            [6] => 
            [7] => 
            [8] => 
            [9] => 
        )
    [prop_key] => Array(
            [0] => 
            [1] => tvg-name
            [2] => group-title
            [3] => 
            [4] => 
            [5] => 
            [6] => tvg-name
            [7] => group-title
            [8] => 
            [9] => 
        )
    [2] => Array( ... duplicate of prop_key .. ) 
   etc. 
)

在上面的数组中查找item的方法是,如果你在运行第一次索引0时查看for循环,匹配$match[0][$i]的主要部分包含所有匹配,但tag数组仅包含与该regx匹配的项,我们可以使用$i索引将它们关联起来。

    if( !empty($match['tag'][$i])){
        //is a tag increment the result index
        ++$index;
    }

如果$match[tag][$i]不为空。如果你在$match[tag][0]时查看$i = 0,你会发现它确实不是空的。在第二个循环$match[tag][1]为空,但$match[prop_key][1]不是,所以我们知道当$i = 1项是prop_key匹配时。这是如何运作的。

-ps-如果你能找到一种方法来删除重复的数字索引,请与我分享......大声笑......如果我没有使用命名的捕获组,这些是正常的匹配,如我说它会变得混乱。

答案 1 :(得分:-1)

获得CURL响应后,通过CURL或fopen函数从远程位置读取文件。

为此,您已经从远程位置读取了目录中的文件,并将所有文件保存到本地服务器中。

您可以使用文件功能“ Stat ”获取所有信息并保存到$ files

我已经提出了如何收集所有信息的想法,然后你可以创建数组。

创建阵列后,您可以序列化打印响应。

答案 2 :(得分:-1)

我在php中做了一个简单的m3u8解析器。 这是一个远程json的m3u8文件解析器,但是很容易更改输出 https://github.com/onigetoc/m3u8-PHP-Parser

我可能很快会更改它或添加一个CURL解析器,而不是file_get_contents()。

<form class="text-center border border-light p-5" id="formulario_datos" method="POST" action="transferencia">

    <p class="h4 mb-4">Ingrese los datos</p>
    <input type="text" id="cuenta" name="cuenta" maxlength="20" class="form-control mb-4" placeholder="Cuenta" required>
    <input type="text" id="beneficiario" maxlength="35" name="beneficiario" class="form-control mb-4" placeholder="Beneficiario" required>

    <div class="form-row mb-4">
        <div class="col">
            <select class="form-control" id="identificador" name="identificador">
            <option value="V">V</option>
            <option value="J">J</option>
            <option value="E">E</option>
          </select>
        </div>
        <div class="col">
            <input type="text" id="identidad" name="identidad" class="form-control" placeholder="Identidad" maxlength="12" required>
        </div>
    </div>
    <input type="email" id="email" name="email" class="form-control" placeholder="E-mail" maxlength="35" required><br>
    <input type="text" id="monto" name="monto" class="form-control" placeholder="Monto" maxlength="9" required><br>
  <input type="text" id="concepto" name="concepto" class="form-control" placeholder="Concepto" maxlength="35" required>

    <button class="btn btn-info my-4 btn-block" id="transferir" type="submit">Enviar Pago</button>

</form>