
在许多应用场景中,视频资源链接通常会包含动态生成的参数,例如过期时间(expire)和访问令牌(token),以实现安全控制和访问限制。一个典型的视频url可能呈现如下格式:
http://cdn.videourl.mp4?expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0
我们的目标是从包含这类URL的文本内容(如HTML页面)中准确地提取出完整的视频URL,并可能进一步解析其查询参数。
正则表达式是处理字符串模式匹配的强大工具。针对上述特定格式的视频URL,我们可以构建一个精确的正则表达式来捕获整个URL及其关键参数。
一个能够匹配固定顺序参数(expire在前,token在后)的正则表达式如下:
立即学习“PHP免费学习笔记(深入)”;
http\S*?\.mp4\?[a-zA-Z]+=([0-9]+)&[a-zA-Z]+=([0-9a-z]+)
正则表达式解析:
在PHP中,可以使用preg_match_all函数来查找所有匹配给定正则表达式的字符串。
<?php
$htmlContent = "
<p>这是一个包含视频链接的页面。</p>
<a href='http://cdn.videourl.mp4?expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0'>观看视频</a>
<img src='image.jpg'>
<p>另一个视频链接:</p>
<div data-video-src='http://cdn.anothervideo.mp4?expire=1635940000&token=abcdef1234567890abcdef1234567890'></div>
";
// 定义正则表达式,注意PHP中需要使用分隔符,如 '/'
$regex = '/http\S*?\.mp4\?[a-zA-Z]+=([0-9]+)&[a-zA-Z]+=([0-9a-z]+)/';
preg_match_all($regex, $htmlContent, $matches, PREG_SET_ORDER);
echo "<h3>使用正则表达式提取结果:</h3>";
if (!empty($matches)) {
foreach ($matches as $match) {
echo "完整URL: " . $match[0] . "<br>";
echo "Expire: " . $match[1] . "<br>";
echo "Token: " . $match[2] . "<br><br>";
}
} else {
echo "未找到匹配的视频URL。\n";
}
?>输出示例:
使用正则表达式提取结果: 完整URL: http://cdn.videourl.mp4?expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0 Expire: 1635939248 Token: 7022dbc14de970c7uc040ac4f35058f0 完整URL: http://cdn.anothervideo.mp4?expire=1635940000&token=abcdef1234567890abcdef1234567890 Expire: 1635940000 Token: abcdef1234567890abcdef1234567890
PREG_SET_ORDER标志使得$matches数组的每个元素都是一个完整的匹配项,其中$match[0]是完整的匹配字符串,$match[1]和$match[2]分别对应正则表达式中第一个和第二个捕获组的内容(即expire和token的值)。
如果URL中的expire和token参数顺序不固定,可以构建一个更复杂的正则表达式,利用非捕获组和命名捕获组来处理:
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]+))
这个正则表达式使用了|(或)来匹配两种可能的参数顺序,并通过(?Pzuojiankuohaophpcnname>...)定义了命名捕获组,使得提取到的参数值可以通过名称访问,提高了代码的可读性。
尽管正则表达式功能强大,但对于解析URL这种结构化的数据,PHP提供了更专业、更健壮的内置函数:parse_url和parse_str。它们能更好地处理URL编码、特殊字符以及参数顺序不确定等复杂情况,且代码可读性更高。
parse_url() 函数可以解析一个URL,并返回其组成部分(如scheme, host, path, query, fragment等)。
parse_str() 函数可以将查询字符串解析到变量中,或者解析到一个数组中。
以下是结合parse_url和parse_str来提取URL参数的示例:
<?php
$videoUrl = "http://cdn.videourl.mp4?expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0";
// 1. 使用 parse_url 提取查询字符串
$queryString = parse_url($videoUrl, PHP_URL_QUERY);
$params = [];
if ($queryString) {
// 2. 使用 parse_str 将查询字符串解析为数组
parse_str($queryString, $params);
}
echo "<h3>使用 parse_url 和 parse_str 提取结果:</h3>";
if (!empty($params)) {
echo "原始URL: " . $videoUrl . "<br>";
echo "查询参数数组: <pre>";
var_dump($params);
echo "</pre>";
// 可以直接访问参数
if (isset($params['expire'])) {
echo "Expire: " . $params['expire'] . "<br>";
}
if (isset($params['token'])) {
echo "Token: " . $params['token'] . "<br>";
}
} else {
echo "未找到URL查询参数。\n";
}
// 示例:处理没有参数的URL
$simpleUrl = "http://cdn.simplevideo.mp4";
$simpleQuery = parse_url($simpleUrl, PHP_URL_QUERY);
$simpleParams = [];
if ($simpleQuery) {
parse_str($simpleQuery, $simpleParams);
}
echo "<br><h3>处理无参数URL:</h3>";
echo "原始URL: " . $simpleUrl . "<br>";
echo "查询参数数组: <pre>";
var_dump($simpleParams);
echo "</pre>";
?>输出示例:
使用 parse_url 和 parse_str 提取结果:
原始URL: http://cdn.videourl.mp4?expire=1635939248&token=7022dbc14de970c7uc040ac4f35058f0
查询参数数组:
array(2) {
["expire"]=>
string(10) "1635939248"
["token"]=>
string(32) "7022dbc14de970c7uc040ac4f35058f0"
}
Expire: 1635939248
Token: 7022dbc14de970c7uc040ac4f35058f0
处理无参数URL:
原始URL: http://cdn.simplevideo.mp4
查询参数数组:
array(0) {
}在PHP中提取视频URL及其参数时,我们有两种主要策略:
最佳实践建议:
通过合理选择和组合这些工具,你可以高效且可靠地处理PHP中的URL提取和参数解析任务。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号