希望你们能帮助我。我有以下.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响应并将所有视频信息保存到一个数组中,我可以在其中访问每个视频的每个属性。
我知道我必须使用一些正则表达式或类似的东西。我只是不明白如何。你可以帮我一些代码吗?非常感谢你。
答案 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>