使用正则表达式获取视频 URL 当前过期时间和令牌

Get video URL with regex for current expire time and token

我正在尝试从页面获取当前视频 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参数的顺序是这样的,您可以在第一个等号之后的部分使用捕获组,在第二个等号之后使用单个捕获组:

http\S*?\.mp4\?[a-zA-Z]+=([0-9]+)&[a-zA-Z]+=([0-9a-z]+)

看到一个regex demo

例如

$html = "http://cdn.videourl.mp4?expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0";

preg_match_all('/http\S*?\.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 标志的命名捕获组。

http\S*?\.mp4\?(?:expire=(?P<expire>[0-9]+)&token=(?P<token>[0-9a-z]+)|token=(?P<token>[0-9a-z]+)&expire=(?P<expire>[0-9]+))

看到一个php demo


请注意,使用 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
)

参见a demo on ideone.com