正则表达式匹配标签之间的文本

80

我有这个字符串:

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

我想将标签中的文本存入数组中,即:

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

我尝试过这个/<b>(.*?)<\/b>/.exec(str),但它只会获取第一个文本。


3
使用DOM接口。更加简单易懂。 - Ed Heal
@EdHeal 这个 HTML 字符串不在 DOM 中。 - wong2
1
关于使用正则表达式解析HTML的所有必要知识:RegEx匹配除XHTML自包含标签外的开放标签 - RobG
4个回答

154
/<b>(.*?)<\/b>/g

正则表达式可视化

在此之后添加g(全局)标志:

/<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)

1
但结果是 ["<b>Bob</b>", "Bob"] - wong2
应该多次使用 _exec_,因为它会记住上一次的调用结果并返回下一个结果。 - Bali Balo
@wong2,标签已经被replace()函数移除了。 - Chuck Krutsinger
如果我需要这个也适用于带属性的标签怎么办? - Илья Зеленько

15
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"]

13

使用match代替,并加上全局标志g。

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

这似乎并不总是有效,例如:https://jsfiddle.net/jnvey51L/2/ - Costantin
@Costantin 这是因为默认情况下.不匹配换行符。您可以将该点替换为[\s\S],然后事情应该按您的预期工作。请注意,尽管这对于简单情况有效,但这并不是完美的解决方案(例如嵌套标记将无法正常工作)。通常不建议使用RegExp来解析HTML。如果您需要任意字符串,请尝试使用DOMParser并在结果上使用querySelectorAll等内容。 - Bali Balo

3

请尝试

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接