如何用PHP解析SVG?解决Simple HTML Dom无法读取SVG内XML的问题
用PHP解析SVG并替换
<use>引用为实际元素 没问题,当然可以用PHP实现这个需求!Simple HTML Dom确实对SVG这类XML内容的解析支持有限,但我们可以结合PHP原生的DOM扩展来完成任务,下面是具体的实现步骤和代码:
实现思路
- 用Simple HTML Dom获取目标页面中包含SVG的元素
- 提取SVG内
<use>标签的xlink:href属性,分离出外部SVG的URL和目标元素ID - 下载外部SVG文件,用DOM解析器提取对应ID的图形元素
- 构建新的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
相关产品推荐
相关产品推荐

