首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写regex以匹配象属性值/值这样的标记元素,即使那些没有用引号包装的

编写regex以匹配象属性值/值这样的标记元素,即使那些没有用引号包装的
EN

Stack Overflow用户
提问于 2016-10-13 17:08:06
回答 2查看 106关注 0票数 0

说我有

代码语言:javascript
复制
<div class="doublequotes"></div>
<div class='simplequotes'></div>
<customElement data-attr-1=no quotes data-attr-2 = again no quotes/>

我希望看到一个不错的正则表达式来获取上面所有的属性/谷值对,如下所示:

  • 类,双引号
  • 类,单纯等
  • 数据-attr-1,没有引号
  • 数据-attr-2,同样没有引号。

请在安装过程中注意以下事项

  • 同时存在单引号/双引号来包装值
  • 可能没有任何报价
  • 可能没有任何引号+多字值
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-13 22:12:20

这里有一个用Javascript编写的解决方案,这样您就可以在这里试用它了,它分为标记和属性,它允许保留父标记(如果不想这样,就不要使用tag[1])。

提取标签然后提取属性的一个主要原因是我们不会在标签之外找到假的“属性”。注意look="a distraction"部件是如何不包含在解析的输出中的。

代码语言:javascript
复制
<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] + " -&gt; " + attr[1] + " -&gt; "
          + attr[2].replace(/^(['"])(.*)\1$/,"$2");  // remove quotes
    }
  };

  document.getElementById("output").innerHTML = out.replace(/</g,"&lt;");

 }

</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()调用)之前,我不得不对<进行转义。

票数 0
EN

Stack Overflow用户

发布于 2016-10-13 20:41:37

经过几次调整后,我成功地建造了一些东西。

代码语言:javascript
复制
([0-9a-zA-z-]+)\s*=\s*(("([^">]*)")|('([^'>]*)')|(([^'"=>\s]+\s)\s*(?![ˆ\s]*=))*)?

这应该是合理的,即使是类似的事情

代码语言:javascript
复制
 <t key1="value1" key2='value2' key3 = value3 key4 = v a l u e 4 key5 = v a l u e 5 />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40027043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档