You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP用preg_match_all匹配setVideoUrlHigh视频URL失效怎么办

代码失效原因

你的代码有3个核心错误,直接导致无法拿到正确结果:

  • 匹配对象传错:你通过file_get_contents拿到的页面源码存在$content变量里,但preg_match_all的搜索目标传的是$url(也就是页面地址字符串本身),根本没有在爬取到的页面内容里做匹配。
  • 正则表达式语法错误:你用#作为正则分隔符,但正则内部直接写了未转义的单引号和斜杠,会直接导致正则解析失败;同时你写的.*是贪婪匹配规则,遇到多个同方法调用时会匹配到超长的错误内容;另外没有设置捕获组,就算匹配成功也只能拿到整段方法调用字符串,无法直接提取出纯URL。
  • 缺少容错逻辑:file_get_contents很可能因为目标站反爬、网络超时、权限限制拿不到页面内容,匹配结果也可能为空,你直接读取$matches[0][0]会触发数组不存在的警告,遇到异常场景直接报错。
修正方法

你可以直接用下面的修正版代码,已经处理了上述问题:

$pageUrl = 'http://www.siteurl.com/embedframe38295/';
// 模拟浏览器请求头,绕过最基础的反爬拦截
$requestContext = stream_context_create([
    'http' => [
        'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36\r\n",
        'timeout' => 10
    ]
]);
$pageContent = file_get_contents($pageUrl, false, $requestContext);
if (!$pageContent) {
    exit("页面内容获取失败,请检查地址或网络状态");
}
// 正则匹配视频地址,用捕获组直接提取单引号内的URL内容
preg_match('/html5player\.setVideoUrlHigh\(\'([^\']+)\'\)/', $pageContent, $matchResult);
if (empty($matchResult[1])) {
    exit("未在页面内匹配到目标视频地址");
}
$videoUrl = $matchResult[1];
echo $videoUrl;

正则说明:这里用[^\']+匹配单引号包裹的URL,含义是匹配所有非单引号的连续字符,比非贪婪匹配.*?执行效率更高,也不会出现跨内容匹配的错误;括号包裹的部分会被单独捕获,直接从$matchResult[1]就能拿到纯视频地址,不需要额外截取字符串。

内容的提问来源于stack exchange,提问作者btgen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:09:22