【问题标题】:PHP get svg tag from SVG file, and show it in HTML in DIVPHP 从 SVG 文件中获取 svg 标签,并在 DIV 中的 HTML 中显示它
【发布时间】:2015-07-11 13:05:56
【问题描述】:

我想读取一个 SVG 文件并从此文件中获取 SVG 标记(因为我想在 html 中显示 svg,例如 <div><svg>...</svg></div> 没有 xml 标头)。

并像 HTML 一样在浏览器中显示这个 svg 标记 - 像 SVG 图像一样打印这个 SVG 标记。因为现在我输出错误“DOMNodeList Object ([length] => 1)”。

PHP

$doc = new DOMDocument();
$doc->load('http://example.com/logo.svg');
$svg = $doc->getElementsByTagName('svg');

echo "<div style='width: 100%, height: 100%; '>";
print_r($svg); // DOMNodeList Object ( [length] => 1 ) 
echo "</div>";

【问题讨论】:

标签: php svg domdocument


【解决方案1】:

我找到了解决方案,但这并不完全是我问题的答案。所以我不会把它标记为答案,但我把这个解决方案留在这里。也许会有人需要它... :)

我只是读取文件内容,然后查找字符串 " 的位置,然后减去这段代码。

PHP

<?php 
$svg_file = file_get_contents('http://example.com/logo.svg');

$find_string   = '<svg';
$position = strpos($svg_file, $find_string);

$svg_file_new = substr($svg_file, $position);

echo "<div style='width:100%; height:100%;' >" . $svg_file_new . "</div>";

?>

【讨论】:

    【解决方案2】:

    您的第一次尝试肯定是在正确的轨道上。不过,我可以发现两个小问题:

    1. 正如您可能已经猜到的那样,您尝试输出一个DOMNodeList 对象,这就是您从调用getElementsByTagName 得到的。顾名思义,它不是单个节点对象,而是这些对象的集合,因此您只会对找到的第一个 svg 节点(下面代码中的 item(0))感兴趣。
    2. DOM* 实例在打印时不会自动转换为字符串。使用C14N() 方法代替输出。

    代码:

    $svg_file = <<<END_OF_SVG
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
    "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
    
    <svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" width='300px' height='300px'>
        <title>Test</title>
        <circle cx='150' cy='150' r='70' style='fill: gold;' />
    </svg>
    END_OF_SVG;
    
    $doc = new DOMDocument();
    $doc->loadXML($svg_file);
    $svg = $doc->getElementsByTagName('svg');
    
    echo '<div style="width: 100%; height: 100%;">';
    echo $svg->item(0)->C14N();
    echo '</div>';
    

    【讨论】:

      【解决方案3】:

      这似乎是该主题在 Google 中的第一个热门话题。根据其他回复和原始问题的内容,原始问题的答案是 getElementsByTagName 返回一个数组,因此您需要获取该数组中的第一项并使用 DOMDocument 的 saveHTML() 方法。为此,我制作了一个简短的实用程序函数。

      function print_svg($file){
          $iconfile = new DOMDocument();
          $iconfile->load($file);
          echo $iconfile->saveHTML($iconfile->getElementsByTagName('svg')[0]);
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-11
        • 2020-03-11
        • 2017-08-19
        • 2018-10-20
        • 1970-01-01
        • 2018-12-11
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多