正则表达式将SVG路径转换为raphael.js路径格式

时间:2013-07-07 17:05:04

标签: regex svg raphael

出于兼容性原因,我正在将美国的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

在文本处理方面,正则表达式是我的一大弱点,我很感激任何帮助。

1 个答案:

答案 0 :(得分:1)

描述

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

First Regex

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

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

第二个正则表达式

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

正则表达式:(?<=\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']
相关问题