【问题标题】:Regex match text between tags [duplicate]标签之间的正则表达式匹配文本[重复]
【发布时间】:2012-07-20 11:29:36
【问题描述】:

我有这个字符串:

My name is <b>Bob</b>, I'm <b>20</b> years old, I like <b>programming</b>.

我想将b标签之间的文本放到一个数组中,即:

['Bob', '20', 'programming']

我试过这个/&lt;b&gt;(.*?)&lt;\/b&gt;/.exec(str),但它只会得到第一个文本。

【问题讨论】:

标签: javascript regex


【解决方案1】:
/<b>(.*?)<\/b>/g

在后面添加g (global) 标志:

/<b>(.*?)<\/b>/g.exec(str)
             //^-----here it is 

但是,如果你想获取所有匹配的元素,那么你需要这样的东西:

var str = "<b>Bob</b>, I'm <b>20</b> years old, I like <b>programming</b>.";

var result = str.match(/<b>(.*?)<\/b>/g).map(function(val){
   return val.replace(/<\/?b>/g,'');
});
//result -> ["Bob", "20", "programming"] 

如果一个元素有属性,正则表达式将是:

/<b [^>]+>(.*?)<\/b>/g.exec(str)

【讨论】:

  • 但结果是["&lt;b&gt;Bob&lt;/b&gt;", "Bob"]?
  • exec 应该多次使用,因为它会记住最后一次调用结果并返回下一个。
  • @wong2 标签被 replace() 删除
  • 如果我也需要它来处理带有属性的标签怎么办?
【解决方案2】:
var root = document.createElement("div");

root.innerHTML = "My name is <b>Bob</b>, I'm <b>20</b> years old, I like <b>programming</b>.";

var texts = [].map.call( root.querySelectorAll("b"), function(v){
    return v.textContent || v.innerText || "";
});

//["Bob", "20", "programming"]

【讨论】:

    【解决方案3】:

    改用 match 和 g 标志。

    str.match(/<b>(.*?)<\/b>/g);
    

    【讨论】:

      【解决方案4】:

      试试

      str.match(/<b>(.*?)<\/b>/g);
      

      【讨论】:

        猜你喜欢
        • 2021-08-24
        • 2014-07-26
        • 1970-01-01
        • 2020-02-24
        • 1970-01-01
        • 2019-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多