web-dev-qa-db-ja.com

PHP SVGファイルからsvgタグを取得し、DIVのHTMLに表示します

SVGファイルを読み取り、このファイルからSVGタグを取得したいのです(svgをhtmlで表示したいためです。例:<div><svg>...</svg></div>(xmlヘッダーなし)。

そして、このsvgタグをHTMLのようにブラウザで表示します-この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>";
10
Patrik

私は解決策を見つけましたが、それは私の質問に対する答えではありません。だから私はそれを答えとしてマークしませんが、この解決策はここに残します。多分それを必要とする誰かがいるでしょう... :)

ファイルの内容を読み取るだけで、文字列"<svg"の位置を探し、このコード部分を差し引きます。

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>";

?>
10
Patrik

あなたは間違いなく最初の試みで正しい軌道に乗っていました。ただし、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
mhall

これは、Googleでのこのトピックの最初のヒットのようです。他の応答と元の質問の内容に基づいて、元の質問に対する答えは、getElementsByTagNameが配列を返すということです。そのため、その配列の最初の項目を取得し、DOMDocumentのsaveHTML()メソッドを使用する必要があります。それを行うための短いユーティリティ関数を作成しました。

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