【问题标题】:RegExp get attributes but not the tag nameRegEx 获取属性但不获取标签名称
【发布时间】:2014-09-13 01:56:04
【问题描述】:

我正在尝试使用 RegExp 从 JavaScript 字符串中获取属性,但我遇到了最后一个问题。

我可以获取带值或不带值的属性,如果忘记了它们之间的空格,我可以获取属性,但我的 RegExp 也将标记名称作为属性获取。

现场示例: http://regex101.com/r/zX5dJ7/3

正则表达式:(\s*\w+(?:=\"[^\"]*(?:\")?)?)

示例 html:<div name="value"otherattribute foo="bar/>

有没有办法让 RegExp 避开标签名称?

编辑:

如果 HTML 是这样的:

<meta charset="utf-8" alone foo="tab"/> <meta charset2="utf-8"foo2="tab"/> <meta charset3="utf-8"alone2 foo3="tab unclosed/>

我想像这样捕获每个属性:

  1. charset="utf-8",
  2. 独自一人,
  3. foo="tab",
  4. charset2="utf-8",
  5. foo2="tab",
  6. charset3="utf-8",
  7. 单独2,
  8. foo3="标签未关闭/>

我以前的正则表达式运行良好,但她抓住了标签名称,我只想让正则表达式避免标签名称。

【问题讨论】:

  • 你的意思是regex101.com/r/zX5dJ7/4。查看右侧的捕获组。
  • 是的,我想避免获取标签名称(现场示例中的元数据),但在您的解决方案中,属性“单独”不会被捕获。
  • 请在问题本身中发布您的示例输入和所需的输出。 foo3="tab unclose 应该如何返回?
  • 您的测试html 似乎是故意的,可能是为了检查格式不正确的情况?即使是浏览器在解析其中一些标签时也会遇到问题,我看不出正则表达式如何在 javascript 中提供帮助。在任何情况下,在 javascript 正则表达式中都很难处理任意格式错误的输入,尤其是因为我们没有后顾之忧。至于如何处理格式正确的 html,我认为答案就足够了,如果可以假定 html 格式正确,任何正则表达式的制作和使用都会简单得多。
  • 是的,我知道 html 必须正确格式化才能使正则表达式更有效。但它仅用于突出显示字符串中的文本(属性)。如果html格式错误,请尝试处理。

标签: javascript regex


【解决方案1】:

这是我能想到的最好的:

([<\w\-]+(?:=)?(?:"|')?[\w\-]+(?:"|')?)

使用正则表达式后,您必须跳过以 &lt; 开头的匹配项。

演示: http://regex101.com/r/aL1sQ0/1

编辑:乔丹本人的最终解决方案:(?:&lt;\w+)?(\s*\w+(?:=\"[^\"]*(?:\")?)?)?

【讨论】:

  • 您可以将其与 trainoasis 的解决方案结合使用。使用他的正则表达式来获取没有标签名称的标签,然后使用我的来获取它们的属性。
  • 啊!我是一个新版本,我结合了@trainoasis 你说的,现在,问题很小,如果标签名称是字符串的最后一个字符,则标签名称的最后一个字符是 catch。演示:regex101.com/r/zX5dJ7/8
  • 我终于找到了这个解决方案。如果您发现有问题或有更好的解决方案,我会接受。演示:regex101.com/r/vA6hO5/1
  • 不错。但是,您原始问题中的 8. example match 与您可能想要的方式不匹配。还是这样?
  • 这 8 个示例正确地将属性捕获为避免标记名的组,这对我有好处。
【解决方案2】:

如果您想在某个 TAG 和它的 CLOSING 之间获取所有内容,您可以使用

(?:<\w*)(.*)\/> 

然后你可以从中提取任何你想要的东西。如果您需要更多信息,请告诉我

【讨论】:

    【解决方案3】:

    假设 HTML 格式正确(请参阅我在 OP 中关于为什么我们应该假设 HTML 格式正确的评论),此正则表达式将解析您想要的所有内容,甚至允许在标签名称中使用“

    (\w+(=\".*?\"|)|&lt;\w+)

    in action

    解析随机格式错误的 HTML 确实不是正则表达式的工作。我在这里引用了许多正则专家在被问到“如何使用正则表达式解析 HTML?”的问题时无数痛苦的呐喊。在 stackoverflow 中搜索此类问题,看看人们会回答什么。 正是你会明白为什么我们应该假设非格式错误的 HTML。

    如上所述,在您获得匹配项并将它们放入数组或其他内容后,您可以检查任何以“

    【讨论】:

    • 我对@Jenny O'Reilly 的回答接近我所需要的。请参阅此示例 regex101.com/r/zX5dJ7/8 唯一的问题是正则表达式捕获了“
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2011-03-10
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多