2011-02-06 3 views
1

Я работаю в ограниченной среде Javascript и не имею доступ к XML-парсеру или дому.RegEx для синтаксического анализа сложных xml javascript

Формат выглядит следующим образом:

<gd:phoneNumber rel="http://schemas.google.com/g/2005#mobile">206 555 1212</gd:phoneNumber> 

Мне нужно, чтобы получить строку [] значение: мобильный 206 555 1212

Значения будут каждый раз разные, но теги всегда то же самое.

Тогда мне нужно, чтобы иметь возможность заменить значения, например: дом, 555-555-5555

Может ли это быть сделано в Regex?

+2

Jamie Zawinski, 1997: «Некоторые люди, столкнувшись с проблемой, думают« Я знаю, я буду использовать регулярные выражения ». Теперь у них есть две проблемы». ... :) – crowne

+0

Какая часть остается неизменной в контексте atrib/val? Как насчет google.com/g/...#mobile? Любые другие attr/val в этом теге? Это в контексте xml? – sln

+0

Да, конечно, это можно сделать с помощью регулярных выражений. Тем не менее, реализация регулярного выражения Javascript не очень эффективна; он даже не может правильно справиться с Unicode. Тем не менее, [это] (http://stackoverflow.com/questions/4284176/doubt-in-parsing-data-in-perl-where-am-i-going-wrong/4286326#4286326) может дать вам некоторые идеи. – tchrist

ответ

0

Это то, что я до сих пор, и она работает, но есть способ лучше?

"<gd:phoneNumber rel=http://schemas.google.com/g/2005#mobile>206 555 1212</gd:phoneNumber>".replace(/#.*</g, '#home>111-111-1111<') 

Возвращает:

"<gd:phoneNumber rel=http://schemas.google.com/g/2005#home>111-111-1111</gd:phoneNumber>" 

Так что я могу инъекционные новые значения

"<gd:phoneNumber rel=http://schemas.google.com/g/2005#mobile>206 555 1212</gd:phoneNumber>".match(/#.*</g)[0].replace(/[#<]/g, "").split(/>/) 

возвращается: [ "мобильный", "206 555 1212"]

позволяет мне для получения значений

0

Это извлекает спички и выполняет замену:

var testString = '<gd:phoneNumber rel=http://schemas.google.com/g/2005#mobile>206 555 1212</gd:phoneNumber>'; 

var regex = /.*#(\w+)">(.*)</i; 

// matches[1] will be "mobile" and matches[2] will be "206 555 1212" 
var matches = regex.exec(testString); 

// Replace #mobile with #home 
testString = testString.replace(matches[1], 'home'); 

// Replace the phone number with 555 555 5555 
testString = testString.replace(matches[2], '555 555 5555'); 

Этих простые замены будут работать до тех пор, пока нет никакого совпадения между этими значениями и остальной частью содержимого XML-элементом (например, если URL-адрес schemas.google.com содержит строку mobile где-то до #mobile, это не сработает). Хотя это так, это более простой способ сделать замены.

+0

Очень приятно. Спасибо!!! – James

1

Существует fast-xml-parser, который основан только на регулярном выражении. Вы можете включить это в свой проект.

//var xml2json = require('fast-xml-parser').parse; 
var jsonObj = xml2json('<gd:phoneNumber rel="http://schemas.google.com/g/2005#mobile">206 555 1212</gd:phoneNumber>', {ignoreNameSpace : true}); 
console.log(jsonObj.phoneNumber); // "206 555 1212" 

Или, если вы сделаете регулярное выражение самостоятельно, я предлагаю вам использовать регулярные выражения, чтобы захватить соответствующую строку как @DaveWard предложил в своем ответе вместо replace.

Смежные вопросы