En tant que format de fichiers basé sur XML, les fichiers SVG contiennent généralement des descriptions de graphiques, tels que des chemins, des lignes, des rectangles, des cercles, etc. Sa structure n'est pas très différente de celle d'un fichier XML normal, mais l'espace de noms et les propriétés d'élément peuvent nécessiter une attention supplémentaire.
Les fichiers SVG utilisent généralement l'espace de noms, ce qui signifie que les éléments du fichier peuvent avoir besoin d'avoir des préfixes spécifiques. Par exemple, l'élément <svg> a généralement la déclaration d'espace de noms suivante:
<img class="max-h-96 w-full" src="data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20...%3D%22%22%3E%0A%3C%2Fsvg%3E">
Si vous utilisez Simplexml_Load_string directement pour analyser un tel fichier, les objets simplexml prendront en considération les espaces de noms, donc lorsque vous accédez aux éléments, vous devrez peut-être traiter ces espaces de noms.
<span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$svg_string</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getName</span></span><span>(); </span><span><span class="hljs-comment">// Sortir: {http://www.w3.org/2000/svg}svg</span></span><span>
</span></span>
Dans ce cas, nous devons utiliser le nom de l'élément avec l'espace de noms pour accéder au contenu pertinent. Par exemple:
<span><span><span class="hljs-variable">$namespaced_svg</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">children</span></span><span>(</span><span><span class="hljs-string">'http://www.w3.org/2000/svg'</span></span><span>);
</span></span>
En plus de l'élément lui-même, certaines propriétés du fichier SVG (telles que XLink: HREF ) peuvent également avoir des espaces de noms. Par conséquent, une attention particulière est également requise lors de l'accès à ces propriétés.
<span><span><span class="hljs-variable">$link</span></span><span> = </span><span><span class="hljs-variable">$element</span></span><span>-></span><span><span class="hljs-title function_ invoke__">attributes</span></span><span>(</span><span><span class="hljs-string">'http://www.w3.org/1999/xlink'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$link</span></span><span>[</span><span><span class="hljs-string">'href'</span></span><span>]; </span><span><span class="hljs-comment">// Sortir对应的属性值</span></span><span>
</span></span>
SVG contient non seulement des descriptions graphiques, mais aussi du texte (telles que <Text> des éléments). Lors de l'analyse de SVG, SimplexML extrait automatiquement les nœuds de texte en chaînes normales. Cependant, certains contenus de texte SVG peuvent contenir des problèmes de formatage tels que des pauses en ligne, des espaces, etc. Ces détails peuvent être ignorés ou mal traités pendant l'analyse.
Lorsque vous accédez à un élément <Text> , vous pouvez extraire du contenu de texte comme vous pourriez accéder à un élément XML normal:
<span><span><span class="hljs-variable">$textElement</span></span><span> = </span><span><span class="hljs-variable">$xml</span></span><span>-></span><span><span class="hljs-title function_ invoke__">xpath</span></span><span>(</span><span><span class="hljs-string">'//svg:text'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$textElement</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>]; </span><span><span class="hljs-comment">// Sortir文本内容</span></span><span>
</span></span>
Cependant, il convient de noter que simplexml_load_string peut ne pas revenir comme prévu si le texte à l'intérieur de l'élément <Text> contient plusieurs éléments enfants ou des structures imbriquées complexes.
Certains fichiers SVG peuvent contenir des scripts JavaScript ou des gestionnaires d'événements (tels que onclick , onload , etc.), qui sont généralement utilisés pour définir des interactions ou des animations. Lors de l'analyse, simplexml_load_string n'analyse pas ces parties de script, mais les problèmes peuvent se produire s'ils sont lus et traités directement.
Si vous n'avez pas besoin de gérer les pièces JavaScript dans SVG, vous pouvez supprimer ou filtrer ces pièces de script via des expressions régulières simples ou des opérations de chaîne.
<span><span><span class="hljs-variable">$clean_svg</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/<script[^>]*>.*?<\/script>/is'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-variable">$svg_string</span></span><span>);
</span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$clean_svg</span></span><span>);
</span></span>
De cette façon, nous pouvons nous assurer que SimplexML ne traite que les données du graphique SVG pures sans être dérangée par la partie du script.
Les fichiers SVG peuvent contenir des caractères spéciaux, tels que & , < , > , etc. Ces caractères ont des significations spécifiques dans les fichiers XML et peuvent avoir besoin d'être échappés. PHP analyse automatiquement ces caractères lors de l'utilisation de simplexml_load_string , mais dans certains cas, il est toujours nécessaire de traiter manuellement ces caractères.
Si le contenu SVG contient des caractères spéciaux qui ne sont pas échappés, il peut provoquer des erreurs d'analyse lors du chargement directement. Assurez-vous que tous les caractères spéciaux du fichier SVG sont correctement échappés ou codés.
<span><span><span class="hljs-variable">$escaped_svg</span></span><span> = </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$svg_string</span></span><span>);
</span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$escaped_svg</span></span><span>);
</span></span>
Les fichiers SVG peuvent être très importants, surtout lorsqu'ils contiennent des graphiques complexes ou de grandes quantités de données. Lors du chargement de grands fichiers SVG avec simplexml_load_string , il peut provoquer des goulots d'étranglement de performances ou des problèmes de débordement de mémoire. Pour faire face à ce type de problème, vous pouvez envisager la lecture de morceaux ou utiliser d'autres méthodes pour optimiser l'utilisation de la mémoire.
La bibliothèque LIBXML de PHP offre de nombreuses options d'optimisation. En configurant libxml_use_internal_errors et autres paramètres, vous pouvez réduire la gestion des erreurs inutile et l'utilisation de la mémoire pendant l'analyse.
<span><span><span class="hljs-title function_ invoke__">libxml_use_internal_errors</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-variable">$xml</span></span><span> = </span><span><span class="hljs-title function_ invoke__">simplexml_load_string</span></span><span>(</span><span><span class="hljs-variable">$svg_string</span></span><span>);
</span></span>