当前位置: 首页 > 知识库问答 >
问题:

如何用PHP获取SVG标记内容

闻人英韶
2023-03-14

我想用PHP获得SVG标记内容。

<?xml version="1.0" encoding="utf-8"?>
<!-- comment  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 width="202.5px" height="226.084px" viewBox="0 0 202.5 226.084" enable-background="new 0 0 202.5 226.084" xml:space="preserve">
   <g>
        <path d="M0,13.628c47.7940,13.628z"/>
        <polygon points="108.48,207.874 145.506,196.948 145.506,204.536 108.48,214.854  "/>
        <path fill="none" stroke="#000000" d="M114.55,223.959"/>
   </g>
   <g>       
        <path fill="none" stroke="#000000" d="M114.55,223.959"/>
   </g>
   <anythingElse>       
        <path fill="none" stroke="#000000" d="M114.55,223.959"/>
   <anythingElse>       
</svg>

PHP:

$svg = new SimpleXMLElement( file_get_contents( 'test.svg' )  );

$svg->registerXPathNamespace('svg', 'http://www.w3.org/2000/svg');
$svg->registerXPathNamespace('xlink', 'http://www.w3.org/1999/xlink');

现在,我希望以字符串的形式获取svg标记内容。

所需结果(硬编码示例):

$content =  '<g>
    <path d="M0,13.628c47.7940,13.628z"/>
    <polygon points="108.48,207.874 145.506,196.948 145.506,204.536 108.48,214.854  "/>
    <path fill="none" stroke="#000000" d="M114.55,223.959"/>
</g>
   <g>       
        <path fill="none" stroke="#000000" d="M114.55,223.959"/>
   </g>
   <anythingElse>       
        <path fill="none" stroke="#000000" d="M114.55,223.959"/>
   <anythingElse> ';

//编辑:

我不想查找g标记:'/svg:svg/svg:g‘。因为不能保证在svg中会有一个g标记。可能有一个以上的g标记或其他一些标记。

我想要获得开始和结束svg标记之间的所有内容。

共有1个答案

楚钊
2023-03-14

您已经正确地看到了(更有可能是:从前面的回答中提供给您的示例代码复制和粘贴而来,W/O进一步理解它),您需要在这里为xpath注册XML命名空间,因为XML中没有它的前缀:

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 width="202.5px" height="226.084px" viewBox="0 0 202.5 226.084" enable-background="new 0 0 202.5 226.084" xml:space="preserve">

它只是URIhttp://www.w3.org/2000/svg,没有给出前缀。它是 根元素的命名空间。

因此,您需要注册前缀(另一个已经有前缀的命名空间应该已经自动注册):

$svg->registerXPathNamespace('svg', 'http://www.w3.org/2000/svg');

你到目前为止都是这么做的。

现在要在xpath查询中使用注册的前缀,请在标记名前缀:

/svg:svg/svg:g[1]

应该为您提供该svg-namespace中的第一个 元素。如果这还需要进一步解释/澄清,请告诉我。

查看在线演示。

这也正是你前面问题的原因:

  • 使用PHP循环SVG元素
 类似资料:
  • 问题内容: 我正在尝试从HTML中获取Facebook的元标记。 我正在使用简单的html dom从站点获取所有html数据。我已经尝试过preg_replace,但是没有运气。 例如,我想要获取此fb元标记的内容: 希望有人能帮忙!:-) 问题答案: 我将建议使用get_meta_tags(),但似乎不起作用(对我而言):s 但是我还是建议还是使用DOMDocument: 希望能帮助到你

  • 问题内容: 我正在使用蜡染来处理SVG图像。有什么办法可以从SVG文件中获取java.awt.image.BufferedImage吗? 我知道有一些转码器,我可以使用它们将SVG转码为PNG,然后使用ImageIO.read()加载该PNG,但是我不想拥有临时文件。 问题答案: 使用蜡染,如下所示:

  • 问题内容: 我在php(string)中有一个div,我想获取内容。 例如: 而且我要 样式在变化,我只知道div ID。 更新 这是我的代码,与turbod源相同,结果也相同。 所以这是原始的html 在此代码之后,我得到以下信息:链接 问题答案: 使用php DomDocument类。http://www.php.net/manual/zh/class.domdocument.php

  • 这是我的绳子 我需要获取和中的文本 我怎么能这样做呢? 我试过了 这是我的小提琴 但是我得到的错误是 未捕获的类型错误:a.getElementsByTagName不是函数 我该怎么做 注意: 这不是来自网站的内容,我试图从其他语句中获取文本,所以我将响应分配给一个变量并处理它。 我只需要使用脚本来执行此操作

  • 我在网站上使用Yoast SEO进行SEO。在我的头文件中,我添加了

  • 我试图在pixioverlay.js(使用pixi.js的绘图覆盖)上绘制svg标记。全新的Pixi我自己,我想我已经把一些东西一起绘制菱形,见第一个代码片段(如果它是不正确的,或需要改进,让我知道) 请问我该怎么做? 在现实生活中,我有很多这样的标记,都是一些几何形状,比如三角形、星形、正方形、圆形等等,总共会有几千个(比如100K甚至更多,这取决于课程的缩放级别。在zoom=0时,可能接近10

  • 我想使用jsoup从网页中提取内容。这些值在内部标签中,如何提取这些值? 例如 我想提取锚点标签中的内容首页*将如何做到这一点?

  • 我有许多大的SVG文件(用在线工具减小大小后大约有200kb)。我真的不希望访问者每次访问时都从我的服务器上下载所有的文本。我想利用CDN和varnish缓存。 如果我使用SVG标签,浏览器、CDN或Varish都会将svg代码缓存在html文档中。SVG没有src属性。 如果我使用图像标记,它将被缓存,但我无法利用SVG标记的preserveAspectRatio和viewBox。在调整浏览器窗