2012-07-21 35 views
29

Tôi có chuỗi này:Regex trận văn bản giữa các thẻ

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

Tôi muốn để có được những văn bản giữa b thẻ để một mảng, đó là:

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

Tôi cố gắng này /<b>(.*?)<\/b>/.exec(str) nhưng nó sẽ chỉ nhận được văn bản đầu tiên.

+3

Sử dụng giao diện DOM. Dễ dàng hơn. –

+0

@EdHeal Chuỗi html này không nằm trong DOM – wong2

+0

Mọi thứ bạn cần biết về phân tích cú pháp HTML với cụm từ thông dụng: [* RegEx khớp thẻ mở trừ thẻ XHTML tự chứa *] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-ngoại trừ-xhtml-self-contained-tags/1732454 # 1732454). – RobG

Trả lời

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

Regular expression visualization

Thêm g (toàn cầu) cờ sau:

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

Tuy nhiên nếu bạn muốn có được tất cả các yếu tố phù hợp, sau đó bạn cần một cái gì đó như thế này:

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"] 
+0

nhưng kết quả là '[" Bob "," Bob "]'? – wong2

+0

_exec_ nên được sử dụng nhiều lần, vì nó nhớ kết quả cuộc gọi cuối cùng và trả về kết quả tiếp theo. –

+0

@ wong2 các thẻ được xóa bởi thay thế() –

4

Sử dụng khớp với thay thế và cờ g.

str.match(/<b>(.*?)<\/b>/g); 
7
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"] 
1

Hãy thử

str.match(/<b>(.*?)<\/b>/g); 
Các vấn đề liên quan