【问题标题】:Regex to transform SVG path to raphael.js path format正则表达式将 SVG 路径转换为 ​​raphael.js 路径格式
【发布时间】:2013-07-05 01:19:19
【问题描述】:

出于兼容性原因,我将美国的 SVG 交互式地图转换为 Javascript 支持的地图。为此,我需要将给定的 SVG 路径转换为 ​​JSON 文件。

一个示例路径列表是

<path 
  d="M 404.13498,227.558 L 407.75898,227.324 L 407.95298,228.019 L 408.99798,
     231.791 L 409.07498,232.061 L 405.21798,232.503 L 404.57198,232.58 L 404.13498,
     227.558" 
  id="01111" 
  inkscape:label="Randolph, AL" 
</path>

我想做的是把它转换成格式

['01111', 'Randolph, AL', 
   'M727,410L734,409L734,410L736,417L736,418L729,419L728,419L727,410']

我知道示例结果已关闭;这是由于示例地图经历了线性扩展。我感兴趣的是转换

M 404.13498,227.558 L 407.75898

进入

M404, 227L407 ... ect

在文本操作方面,正则表达式是我的一大弱点,如果能提供任何帮助,我将不胜感激。

【问题讨论】:

  • 您从哪里获得结果中的值?结果似乎来自不同的源路径...您能否还指定逻辑-哪个数字来自哪个部分?
  • 正则表达式用于匹配某些内容。我不会为此使用正则表达式。而是编写一个程序,该程序使用 XML 库读取文件,然后将其写入另一个文件。毕竟在 XML 中可能有 cmets 等等。
  • @Jerry,给出的示例来自jebruner.com/2011/11/… 我不确定他是如何进行数据转换的,但他确实指出新值是原始地图线性扩展的结果.
  • @JennyO'Reilly,这是来自 wikimedia Commons 上的美国县级地图的 SVG 标记。标记中没有 cmets。
  • 你也许可以使用this regex,但是啊,我不认为我知道足够的javascript在提取它们后将它们全部整理出来:(

标签: regex svg raphael


【解决方案1】:

说明

我会分两步完成。首先收集字符串中的每个路径。其次从您不想保留的每个字符串中删除文本。

第一个正则表达式

这将捕获路径中的所有属性,而不考虑它们在标记中的顺序。它还跳过了一些有问题的问题,其中属性值可能包含看起来像实际标签的字符串。

<path\s
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sd=('[^']*'|"[^"]*"|[^'"][^\s>]*))
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sid=('[^']*'|"[^"]*"|[^'"][^\s>]*))
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sinkscape:label=('[^']*'|"[^"]*"|[^'"][^\s>]*))

第二个正则表达式

这只会应用于d属性,它基本上会替换每个数字的所有空格小数部分,以及换行符。

正则表达式:(?&lt;=\w|\s)\s|\.\d+|[\r\n"]

替换为:无

其他字段的双引号将被删除。

示例

我不是 javascript 程序员,但是在 powershell 中我会这样处理问题:

代码

$String = '<path 
  d="M 404.13498,227.558 L 407.75898,227.324 L 407.95298,228.019 L 408.99798,
     231.791 L 409.07498,232.061 L 405.21798,232.503 L 404.57198,232.58 L 404.13498,
     227.558" 
  id="01111" 
  inkscape:label="Randolph, AL" 
>
</path>
'

[regex]$FirstRegex = @'
<path\s(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sd=('[^']*'|"[^"]*"|[^'"][^\s>]*))(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sid=('[^']*'|"[^"]*"|[^'"][^\s>]*))(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\sinkscape:label=('[^']*'|"[^"]*"|[^'"][^\s>]*))
'@

$FirstRegex.matches($String) | foreach {

    $d = $_.Groups[1].Value -replace '(?<=\w|\s)\s|\.\d+|[\r\n"]', ""
    $id = $_.Groups[2].Value -replace '"', ""
    $label = $_.Groups[3].Value -replace '"', ""
    Write-Host "['$id', '$label', '$d']"
    } # next match

输出

['01111', 'Randolph, AL', 'M404,227L407,227L407,228L408,231L409,232L405,232L404,232L404,227']

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 2019-04-09
    • 2019-10-03
    • 2012-03-30
    • 2020-11-10
    • 2017-08-23
    • 1970-01-01
    • 2020-09-30
    • 2014-05-09
    相关资源
    最近更新 更多