2013-07-07 3 views
2

В целях совместимости я конвертирую интерактивную карту SVG в США в поддерживаемый Javascript. Для этого мне нужно преобразовать данные пути SVG в файл JSON.Regex для преобразования пути SVG к формату пути raphael.js

Пример пути перечисление

<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 

регулярных выражений моя большая слабость, когда дело доходит до обработки текста, и я был бы признателен за любую помощь.

+0

Где вы получили значения в результатах? Кажется, что результаты исходили из другого исходного пути ... Не могли бы вы также указать логику - какой номер поступает из какой части? – Jerry

+0

Регулярное выражение используется для соответствия. Я бы не использовал для этого регулярное выражение. Вместо этого напишите программу, которая использует библиотеку XML для чтения файла, а затем записывает его в другой файл.В конце концов, в XML могут быть комментарии и т. Д. –

+0

@Jerry, приведенный пример от http://jebruner.com/2011/11/how-to-build-an-interactive-map-with-open-source-tools/ Я не уверен, как он сделал преобразование данных, но он утверждает, что новые значения являются результатом линейного расширения исходной карты. – Jason

ответ

1

Описание

Я бы сделал это в два этапа. Сначала соберите каждый из путей в строке. Затем удалите текст из каждой строки, которую вы не хотите сохранить.

Первый Regex

Это захватывает все атрибуты с пути без учета их порядка в теге. Он также пропускает некоторые проблемные проблемы, в которых значения атрибутов могут содержать строки, которые выглядят как фактические теги.

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

Второй Regex

Это будет применяться только к атрибутам d, и он в основном заменяет все пробелы дробная часть каждой цифры и символы новой строки.

Regex: (?<=\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'] 
Смежные вопросы