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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:11:14