说我有
<div class="doublequotes"></div>
<div class='simplequotes'></div>
<customElement data-attr-1=no quotes data-attr-2 = again no quotes/>
我希望看到一个不错的正则表达式来获取上面所有的属性/谷值对,如下所示:
请在安装过程中注意以下事项
发布于 2016-10-13 22:12:20
这里有一个用Javascript编写的解决方案,这样您就可以在这里试用它了,它分为标记和属性,它允许保留父标记(如果不想这样,就不要使用tag[1])。
提取标签然后提取属性的一个主要原因是我们不会在标签之外找到假的“属性”。注意look="a distraction"部件是如何不包含在解析的输出中的。
<textarea id="test" style="width:100%;height:11ex">
<div class="doublequotes"> look="a distraction" </div><div class='simplequotes'></div>
<customElement data-attr-1=no quotes data-attr-2 = again no quotes/>
<t key1="value1" key2='value2' key3 = value3 key4 = v a l u e 4 key5 = v a l u e 5 />
Poorly nested 1 (staggered tags): <a1 b1=c1>foo<d1 e1=f1>bar</a1>baz</d1>
Poorly nested 2 (nested tags): <a2 b2=c2 <d2 e2=f2>>
</textarea>
<script type="text/javascript">
function parse() {
var xml = document.getElementById("test").value; // grab the above text
var out = ""; // assemble the output
tag_re = /<([^\s>]+)(\s[^>]*\s*\/?>)/g; // each tag as (name) and (attrs)
// each attribute, leaving room for future attributes
attr_re = /([^\s=]+)\s*=\s*("[^"]*"|'[^']*'|[^'"=\/>]*?[^\s\/>](?=\s+\S+\s*=|\s*\/?>))/g;
while(tag = tag_re.exec(xml)) { // for each tag
while (attr = attr_re.exec(tag[2])) { // for each attribute in each tag
out += "\n" + tag[1] + " -> " + attr[1] + " -> "
+ attr[2].replace(/^(['"])(.*)\1$/,"$2"); // remove quotes
}
};
document.getElementById("output").innerHTML = out.replace(/</g,"<");
}
</script>
<button onclick="parse()" style="float:right;margin:0">Parse</button>
<pre id="output" style="display:table"></pre>
我不知道这有多完整,因为您没有明确说明什么是有效的,什么是无效的。对这个问题的评论已经证明这既不是HTML也不是XML。
更新:在嵌套测试中添加了,这两个测试在XHTML中都是无效的,以回答关于重叠元素的注释。此代码不承认<d2是一个新元素,因为它位于另一个元素中,因此假定它是b2属性值的一部分。因为这包括了<和>字符,所以在将其呈现为<pre>标记(这是最后的replace()调用)之前,我不得不对<进行转义。
发布于 2016-10-13 20:41:37
经过几次调整后,我成功地建造了一些东西。
([0-9a-zA-z-]+)\s*=\s*(("([^">]*)")|('([^'>]*)')|(([^'"=>\s]+\s)\s*(?![ˆ\s]*=))*)?这应该是合理的,即使是类似的事情
<t key1="value1" key2='value2' key3 = value3 key4 = v a l u e 4 key5 = v a l u e 5 />https://stackoverflow.com/questions/40027043
复制相似问题