如何使用PHP DOMDocument和DOMXPath提取HTML中getFullData方法的内联参数并构建URL
解决方案:精准筛选并提取
getFullData参数,构建目标数组 要搞定这个问题,我们可以通过精准XPath定位+正则解析参数+行数据关联整合三步实现,具体操作如下:
1. 用XPath精准锁定目标<a>标签
首先得把范围限定在searchTable表格内,并且只抓onclick属性里调用getFullData的<a>标签,这样能彻底避开其他无关的<a>标签干扰。对应的XPath表达式如下:
$xPath = new DOMXPath($doc); // 仅匹配searchTable表格中、onclick包含getFullData的a标签 $targetLinks = $xPath->query("//table[@class='searchTable']//a[contains(@onclick, 'getFullData(')]");
2. 解析onclick参数并构建目标URL
观察getFullData( '', 'K0072', 'B20' )的参数格式,我们需要提取第二个和第三个字符串参数(也就是part和m的值),用正则表达式就能轻松搞定:
// 适配参数周围可能存在的空格,精准匹配getFullData的参数 $pattern = "/getFullData\s*\(\s*'([^']*)'\s*,\s*'([^']*)'\s*,\s*'([^']*)'\s*\)/"; foreach ($targetLinks as $link) { $onclickAttr = $link->getAttribute('onclick'); if (preg_match($pattern, $onclickAttr, $matches)) { $part = $matches[2]; $model = $matches[3]; $url = "https://pi.php?part={$part}&m={$model}"; // 后续将该URL关联到对应行的数据中 } }
3. 整合行数据与URL,生成最终数组
比起原代码遍历所有<td>的方式,直接遍历表格的每一行(跳过表头)会更可靠,同时能自然关联该行内的<a>标签参数。完整代码如下:
$doc = new DOMDocument(); $doc->loadHTML(getHtml()); $doc->preserveWhiteSpace = false; $doc->encoding = 'UTF-8'; $xPath = new DOMXPath($doc); // 获取searchTable的所有数据行,跳过表头行 $rows = $xPath->query("//table[@class='searchTable']//tbody/tr[position() > 1]"); $dataArray = []; $pattern = "/getFullData\s*\(\s*'([^']*)'\s*,\s*'([^']*)'\s*,\s*'([^']*)'\s*\)/"; foreach ($rows as $row) { // 提取当前行所有td的文本内容 $tds = $xPath->query("./td", $row); $rowData = []; foreach ($tds as $td) { $rowData[] = trim($td->textContent); } // 定位当前行第一个td内的目标a标签,提取参数并构建URL $link = $xPath->query("./td[1]/a[contains(@onclick, 'getFullData(')]", $row)->item(0); if ($link) { $onclickAttr = $link->getAttribute('onclick'); if (preg_match($pattern, $onclickAttr, $matches)) { $part = $matches[2]; $model = $matches[3]; $rowData[] = "https://pi.php?part={$part}&m={$model}"; } } $dataArray[] = $rowData; } var_dump($dataArray); die();
代码细节说明:
- 用
//tbody/tr[position() > 1]精准跳过表头行,只处理数据行; - 先提取当前行所有
<td>的文本,保留原数组的前4项结构; - 定位当前行第一个
<td>内的目标<a>标签,解析参数后生成URL并追加到行数据末尾; - 正则表达式兼容参数周围的空格,适配不同格式的
onclick属性值。
执行这段代码后,就能得到你需要的包含目标URL的最终数组结构。
内容的提问来源于stack exchange,提问作者Subrata Sarkar
相关产品推荐
相关产品推荐

