【问题标题】:regular expression (javascript) How to match anything beween two tags any number of times正则表达式(javascript)如何多次匹配两个标签之间的任何内容
【发布时间】:2009-05-18 14:40:22
【问题描述】:

我正在尝试查找 HTML 页面中所有出现在 <nobr></nobr> 标记之间的项目。 编辑:(nobr 是一个例子。我需要在随机字符串之间找到内容,而不是总是标签)

我试过了

var match = /<nobr>(.*?)<\/nobr>/img.exec(document.documentElement.innerHTML);
alert (match);

但它只出现一次。 + 它出现两次,一次带有&lt;nobr&gt;&lt;/nobr&gt; 标签,一次没有。我只需要没有标签的版本。

【问题讨论】:

标签: javascript regex


【解决方案1】:

你需要循环进行

var match, re = /<nobr>(.*?)<\/nobr>/img;
while((match = re.exec(document.documentElement.innerHTML)) !== null){
   alert(match[1]);
}

【讨论】:

  • 不需要这个“!== null”。没有它,表达式的计算结果为 false 就好了。
【解决方案2】:

使用 DOM

var nobrs = document.getElementsByTagName("nobr")

然后您可以遍历所有 nobr 并提取 innerHTML 或对其应用任何其他操作。

【讨论】:

  • 这是一个很好的解决方案,但我需要一个针对 HTML 文件中任何模式的通用解决方案,而不仅仅是标准标签
  • getElementsByTagName() 将适用于文档中任何格式良好的 xml,而不仅仅是有效的 xhtml 标签。
  • 也许你应该在你的问题中指出这一点。
【解决方案3】:

(由于我无法评论拉斐尔的正确答案……)

exec 正在做它应该做的事情——找到第一个匹配项,在match 对象中返回结果,并为下一次exec 调用做好准备。 match 对象包含(在索引 0 处)与整个正则表达式匹配的整个字符串。在随后的槽中是与括号中的子组匹配的字符串的位。因此,match[1] 包含与您的示例中的 "(.*?)" 匹配的字符串位。

【讨论】:

    【解决方案4】:

    你可以使用

    while (match = /<nobr>(.*?)<\/nobr>/img.exec("foo <nobr> hello </nobr> bar <nobr> world </nobr> foobar"))
        alert (match[1]);
    

    【讨论】:

    • 原来在 IE 中执行这样的 while 循环时存在错误。拉斐尔的方式应该可行
    【解决方案5】:

    如果您使用的字符串不是 xml 元素,并且您坚持使用正则表达式,那么您得到的返回值可以用括号来解释。 .exec 返回整个匹配字符串,后跟括号表达式的内容。

    如果您的文档包含:

    这已经结束了。
    嗡嗡声。这是在.unBzz。

    然后

    /Bzz.(.*?)unBzz./img.exec(document.documentElement.innerHTML)

    会给你'Bzz。这是在。unBzz。在返回数组的元素 0 和“这是在。”在元素 1 中。尝试将整个数组显示为逗号分隔列表,因为这是 JavaScript 尝试显示它的方式。

    所以 alert($match[1]); 是你所追求的。

    【讨论】:

      【解决方案6】:

      这需要一些步骤,但你可以这样做

      match = document.documentElement.innerHTML.match(/<nobr>(.*?)<\/nobr>/img)
      alert(match)//includes '<nobr>'
      
      match_length = match.length;
      for (var i = 0; i < match_length; i++)
      {
          var match2 = match[i].match(/<nobr>(.*?)<\/nobr>/im);//same regex without the g option
          alert(match2[1]);
      }
      

      【讨论】:

        猜你喜欢
        • 2013-10-31
        • 1970-01-01
        • 2016-10-22
        • 2022-07-06
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2018-04-04
        • 2011-10-13
        相关资源
        最近更新 更多