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

如何用PHP解析SVG?解决Simple HTML Dom无法读取SVG内XML的问题

用PHP解析SVG并替换<use>引用为实际元素

没问题,当然可以用PHP实现这个需求!Simple HTML Dom确实对SVG这类XML内容的解析支持有限,但我们可以结合PHP原生的DOM扩展来完成任务,下面是具体的实现步骤和代码:

实现思路

  1. 用Simple HTML Dom获取目标页面中包含SVG的元素
  2. 提取SVG内<use>标签的xlink:href属性,分离出外部SVG的URL和目标元素ID
  3. 下载外部SVG文件,用DOM解析器提取对应ID的图形元素
  4. 构建新的SVG元素,替换原有的<use>引用为实际图形,并添加需要的viewBox属性

完整代码示例

<?php
include __DIR__ . '/simple_html_dom.php';

// 1. 获取页面中的目标元素(包含SVG)
$data = file_get_html('http://playoverwatch.com/player-profile');
$result = $data->find('.endorsement-level', 0);
if (!$result) {
    die('无法找到目标元素');
}

// 2. 从SVG中提取use标签的xlink:href属性
$svgElement = $result->find('svg.EndorsementIcon-background', 0);
if (!$svgElement) {
    die('未找到目标SVG元素');
}

$svgHtml = $svgElement->outertext;
$dom = new DOMDocument();
// 忽略HTML解析时的非致命错误
libxml_use_internal_errors(true);
$dom->loadHTML($svgHtml);
libxml_clear_errors();

$useTag = $dom->getElementsByTagName('use')->item(0);
if (!$useTag) {
    die('SVG中未找到use标签');
}

$href = $useTag->getAttribute('xlink:href');
// 分离外部SVG地址和目标元素ID
[$externalSvgUrl, $targetId] = explode('#', $href);

// 3. 下载并解析外部SVG文件
$externalSvgContent = file_get_contents($externalSvgUrl);
if (!$externalSvgContent) {
    die('无法下载外部SVG文件');
}

$svgDom = new DOMDocument();
libxml_use_internal_errors(true);
$svgDom->loadXML($externalSvgContent);
libxml_clear_errors();

$targetElement = $svgDom->getElementById($targetId);
if (!$targetElement) {
    die('外部SVG中未找到目标元素');
}

// 4. 构建最终的SVG内容
$finalSvg = $dom->createElement('svg');
// 保留原SVG的class属性
$finalSvg->setAttribute('class', 'EndorsementIcon-background');
// 添加期望的viewBox属性
$finalSvg->setAttribute('viewBox', '0 0 36 36');
// 将外部SVG中的circle元素导入并添加到新SVG中
$finalSvg->appendChild($dom->importNode($targetElement, true));

// 输出最终的SVG代码
echo $dom->saveHTML($finalSvg);
?>

代码说明

  • 先用Simple HTML Dom定位到页面中的目标元素,再提取其中的SVG代码
  • 借助原生DOMDocument处理SVG内容,它对XML格式的支持比Simple HTML Dom更可靠
  • 下载外部SVG后,解析并提取出需要的<circle>元素
  • 最后整合属性和图形元素,输出的就是你期望的SVG结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:27:28