2013-07-09 3 views
1

Я пытаюсь написать скрипт регулярного выражения, который будет анализировать атрибуты имени HTML и возвращать каждый вложенный массив в соответствие. Вот пример:Regex For HTML Name Attribute

<input type="text" name="contact[email]" /> 
<input type="text" name="contact[address][street]" /> 

Мне нужно немного яваскрипта регулярное выражение, которое будет анализировать эти и соответствовать их таким образом

Match 1: contact Match 2: email 
Match 1: contact Match 2: address Match 3: street 

Вот текущее регулярное выражение у меня есть:

/(^.*?)(\[(.*?)\])?$/ 

Спасибо!

+0

Что ваш движок регулярных выражений или окружающей среды? – Jerry

+0

Вы используете регулярное выражение в атрибуте 'name' или во всей строке HTML? –

+0

@Jerry это Javascript – MrGrinst

ответ

2

Я думаю, что самый простой способ сделать это

var str = "contact[email]" 
str.match(/\w+/g) 
//=> ["contact", "email"] 

var str = "contact[address][street]" 
str.match(/\w+/g) 
//=> ["contact", "address", "street"] 
+0

Да, вы правы, это оказалось намного проще! – MrGrinst

+0

Хороший ответ! Мне просто любопытно. Будут ли на пятнах, которые говорят «адрес» или «электронная почта», фактический адрес/адрес электронной почты, или это будет просто слово? Если это просто слово, то вы все настроены, но если вам нужно взять фактическое электронное письмо, это не сработает. – Th3BFG

+0

@ Th3BFG, выход точно так же отображается в моем сообщении. Мой код ничего не делает для чтения атрибута 'value' элемента' INPUT'. – naomik

0
<input type="(?<type>[A-Za-z0-9]+)" name="(?<Name>[A-Za-z0-9\[\]]+)" /> 

работает нормально. Я приложил изображение, чтобы показать, как работает

enter image description here

, как каждое значение будет возвращено в массиве после REGEXMATCH, , то вы можете сделать это

var first = RegexMatch.Groups["Name"].Split('[')[0]; 

вы получите первое значение в name="contact[address][street]", первый = «связаться» , то вы можете сделать

var second = regexMatch.Groups["Name"].Split('[')[1]; 
then second = "address"; 

кстати это для C#, конвертировать в javascript !!

2

Что я буду делать это разграничить каждый из ваших name с [] Так что бы так:

<input type="text" name="[contact][email]" /> 
<input type="text" name="[contact][address][street]" /> 

Тогда я хотел бы использовать это для регулярных выражений:

(?:\[)(.*?)(?:\]) 

порезов решение вниз по количеству необходимых операций и значительно упростит ваше соглашение об именах. Каждый матч будет представлять собой отдельный элемент в разделе name

+0

О, и если ваш двигатель с регулярным выражением требует этого, используйте это: '^ (?: \ [) (. *?) (?: \]) $' – Th3BFG

+0

Я думаю, что вашему движку regex захотелось бы этого: '/ (?: \ [) (. *?) (?: \]) $/g' – Th3BFG

1

использовать следующие регулярные выражения:

/(^[^\[]+)(?=\[)|(([^\[\]]+)(?=\]))/g 

Пример использования ниже.

Demo fiddle here.

HTML:

<input id="one" type="text" name="contact[email]" /> 
<input id="two" type="text" name="contact[address][street]" /> 

JavaScript:

var regex = /(^[^\[]+)(?=\[)|(([^\[\]]+)(?=\]))/g; 

var nameOne = document.getElementById('one').getAttribute('name'); 
console.log('one: ', nameOne.match(regex)); 
var nameTwo = document.getElementById('two').name; 
console.log('two: ',nameTwo.match(regex)); 

Выход:

one: ["contact", "email"] 
two: ["contact", "address", "street"] 
+0

Спасибо, сработало! – MrGrinst

0

я хотел бы использовать раскол(), чтобы захватить средние-ломти вместо мо ре сложных Regexps:

var strFormHTML='<input type="text" name="contact[email]" /><input type="text" name="contact[address][street]" />'; 
var names = strFormHTML.split(/[\W\w]+? name=\"([^"]+)\"[\w\W]+?/).filter(Boolean).slice(0,-1); 
alert(names); //shows: "contact[email]", "contact[address][street]"