如何用PHP Simple HTML DOM Parser解析data-extension属性
解决PHP Simple HTML DOM Parser无法获取data-extension属性并提取URL的问题
这个问题我之前也踩过坑,主要是两个关键点没处理对:特殊字符属性名的获取方式,以及JSON字符串的解析步骤,咱们一步步来解决:
为什么之前输出的是一连串0?
你写的$e->data-extension在PHP里会被解析成$e->data - extension——这里的减号是算术运算符,而$e->data和extension都是未定义的变量,默认值为0,0减0自然输出0,这是语法上的误解导致的。
正确获取data-extension属性的两种方法
因为属性名包含减号这种特殊字符,不能直接用->属性名的常规写法,有两种可靠的方式:
- 使用
getAttribute()方法(推荐,兼容性更好):$dataExtension = $e->getAttribute('data-extension'); - 用花括号包裹属性名,明确告诉PHP这是一个完整的属性名:
$dataExtension = $e->{'data-extension'};
解析JSON并提取目标URL
拿到的data-extension值是一个JSON字符串,需要用json_decode()转换成PHP可操作的对象或数组,然后就能取出里面的URL了:
完整代码示例(关联数组方式)
foreach($html->find('a[class=video]') as $e) { // 获取属性值 $dataExtension = $e->getAttribute('data-extension'); // 解析JSON为关联数组(第二个参数true转为数组) $mediaData = json_decode($dataExtension, true); // 检查解析是否成功(可选,防止JSON格式错误) if (json_last_error() !== JSON_ERROR_NONE) { echo 'JSON解析失败'; continue; } // 提取并输出URL echo $mediaData['mediaObj']['url'] . '<br>'; }
完整代码示例(对象方式)
如果你习惯用对象操作,也可以这样写:
foreach($html->find('a[class=video]') as $e) { $dataExtension = $e->{'data-extension'}; $mediaData = json_decode($dataExtension); if (!$mediaData || !isset($mediaData->mediaObj->url)) { echo '数据格式错误'; continue; } echo $mediaData->mediaObj->url . '<br>'; }
这样就能正确输出你想要的http://a-website.com/ondemand/226/217.js了。
内容的提问来源于stack exchange,提问作者user3080392
相关产品推荐
相关产品推荐

