我正在尝试编写一个正则表达式脚本,该脚本将解析HTML名称属性并将每个嵌套数组作为匹配项返回。这是一个例子:
<input type="text" name="contact[email]" />
<input type="text" name="contact[address][street]" />
我需要一些javascript正则表达式来解析那些并以这种方式匹配它们
Match 1: contact Match 2: email
Match 1: contact Match 2: address Match 3: street
这是我现有的正则表达式:
/(^.*?)(\[(.*?)\])?$/
谢谢!
答案 0 :(得分:2)
我要做的是用name
分隔每个[]
所以它会是这样的:
<input type="text" name="[contact][email]" />
<input type="text" name="[contact][address][street]" />
然后我会将它用于正则表达式:
(?:\[)(.*?)(?:\])
我的解决方案减少了所需的操作数量,使您的命名约定更直接。每个匹配代表name
部分中的单独条目
答案 1 :(得分:2)
我认为最简单的方法是
var str = "contact[email]"
str.match(/\w+/g)
//=> ["contact", "email"]
var str = "contact[address][street]"
str.match(/\w+/g)
//=> ["contact", "address", "street"]
答案 2 :(得分:1)
使用以下正则表达式:
/(^[^\[]+)(?=\[)|(([^\[\]]+)(?=\]))/g
以下示例用法。
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"]
答案 3 :(得分:0)
<input type="(?<type>[A-Za-z0-9]+)" name="(?<Name>[A-Za-z0-9\[\]]+)" />
工作正常。我附上了图片来展示如何运作
因为每个值都将在RegexMatch之后返回数组, 然后你可以这样做
var first = RegexMatch.Groups["Name"].Split('[')[0];
您将获得name="contact[address][street]"
中的第一个值,第一个=“联系人”
那么你可以做到
var second = regexMatch.Groups["Name"].Split('[')[1];
then second = "address";
这是C#的方式,转换为javascript !!
答案 4 :(得分:0)
我喜欢使用split()来抓取中间块而不是更复杂的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]"