我正在尝试从页面获取当前视频URL
。视频URL具有expire
时间和token
,格式为:http://cdn.videourl.mp4?expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0
这就是我目前所得到的:
$html = file_get_contents("http://www.videos.com/");
preg_match_all('/(http.*mp4?[a-zA-Z]+=[0-9]+&[a-zA-Z]+=([0-9]+([a-zA-Z]+[0-9]+)+)',
$html,
$posts, // will contain the article data
PREG_SET_ORDER // formats data into an array of posts
);
foreach ($posts as $post) {
$link = $post[0];
echo $link;
}
有了这个正则表达式/(http.*mp4(.*?))/
,我可以获得url,直到.mp4
我的正则表达式中缺少什么来获得完整的URL
?我也试过这个(但我觉得少了一些…(:/(http.*mp4?[a-zA-Z]+=[0-9]+&[a-zA-Z]+=([0-9]+([a-zA-Z]+[0-9]+)+)
在php示例中,正则表达式在模式开头包含一个未闭合的括号。preg_match_all
中的模式也缺少分隔符
假设querystring参数的顺序是这样的,您可以为第一个等号后的部分使用一个捕获组,并在第二个等号后使用一个单独的捕获组:
httpS*?.mp4?[a-zA-Z]+=([0-9]+)&[a-zA-Z]+=([0-9a-z]+)
请参阅regex演示。
例如
$html = "http://cdn.videourl.mp4?expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0";
preg_match_all('/httpS*?.mp4?[a-zA-Z]+=([0-9]+)&[a-zA-Z]+=([0-9a-z]+)/',
$html,
$posts, // will contain the article data
PREG_SET_ORDER // formats data into an array of posts
);
var_export($posts);
输出
array (
0 =>
array (
0 => 'http://cdn.videourl.mp4?expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0',
1 => '1635939248',
2 => '7022dbc14de970c7uc040ac4f35058f0',
),
)
如果参数的顺序不固定,也可以使用具有相同名称和J
标志的命名捕获组。
httpS*?.mp4?(?:expire=(?P<expire>[0-9]+)&token=(?P<token>[0-9a-z]+)|token=(?P<token>[0-9a-z]+)&expire=(?P<expire>[0-9]+))
请参阅php演示。
请注意,使用parse_url可能更容易获得键值对。
例如
parse_str(parse_url($html, PHP_URL_QUERY), $result);
var_dump($result);
输出
array(2) {
["expire"]=>
string(10) "1635939248"
["token"]=>
string(32) "7022dbc14de970c7uc040ac4f35058f0"
}
您可以使用内置函数:
<?php
$url = "http://cdn.videourl.mp4?expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0";
// parts
$parts = parse_url($url);
print_r($parts);
// query
parse_str($parts["query"], $query);
print_r($query);
?>
这产生
Array
(
[scheme] => http
[host] => cdn.videourl.mp4
[query] => expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0
)
Array
(
[expire] => 1635939248
[token] => 7022dbc14de970c7uc040ac4f35058f0
)
请参阅videone.com.上的演示