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
相关产品推荐
相关产品推荐

