Xóa thẻ HTML trong Javascript bằng Regex


108

Tôi đang cố gắng xóa tất cả các thẻ html ra khỏi một chuỗi trong Javascript. Đây là những gì tôi có ... Tôi không thể hiểu tại sao nó không hoạt động .... bất kỳ ai biết tôi đang làm gì sai?

<script type="text/javascript">

var regex = "/<(.|\n)*?>/";
var body = "<p>test</p>";
var result = body.replace(regex, "");
alert(result);

</script>

Cảm ơn rất nhiều!

Câu trả lời:


237

Hãy thử điều này, lưu ý rằng ngữ pháp của HTML quá phức tạp để các cụm từ thông dụng luôn đúng 100%:

var regex = /(<([^>]+)>)/ig
,   body = "<p>test</p>"
,   result = body.replace(regex, "");

console.log(result);

Nếu bạn sẵn sàng sử dụng một thư viện như jQuery , bạn có thể chỉ cần thực hiện điều này:

console.log($('<p>test</p>').text());

2
Tại sao bạn quấn regex trong một chuỗi? var regex = / (<([^>] +)>) / ig;
brianary 30/09/09

Điều này sẽ không hoạt động. Cụ thể, nó sẽ không thành công trên các thẻ ngắn: is-thought.co.uk/book/sgml-9.htm#SHORTTAG
Mike Samuel

4
Đây là một câu hỏi cũ nhưng tôi sẽ chỉ đăng câu này ở đây: jsperf.com/regex-replace-vs-jquery-text
Joshua

2
Hãy thử chạy nó trên "<img src=bogus onerror=alert(1337)". Lần đầu tiên không thành công vì trình phân tích cú pháp HTML không yêu cầu thẻ cuối cùng được đóng bởi a >và lần thứ hai không thành công vì quá trình tải hình ảnh bắt đầu ngay cả trước khi cây DOM đã phân tích cú pháp được thêm vào DOM và $('<img ...>')gọi trình phân tích cú pháp HTML.
Mike Samuel

1
Giải pháp regex cũng sẽ không thành công nếu a >được bao gồm trong một giá trị thuộc tính; như thế này<div data="a + b > c">
MT0

34

Đây là một câu hỏi cũ, nhưng tôi tình cờ gặp nó và nghĩ rằng tôi sẽ chia sẻ phương pháp tôi đã sử dụng:

var body = '<div id="anid">some <a href="link">text</a></div> and some more text';
var temp = document.createElement("div");
temp.innerHTML = body;
var sanitized = temp.textContent || temp.innerText;

sanitized bây giờ sẽ chứa: "some text and some more text"

Đơn giản, không cần jQuery và nó sẽ không làm bạn thất vọng ngay cả trong những trường hợp phức tạp hơn.


Hiya. Về cơ bản, tất cả những gì nó làm là tạo một DIV mới, đặt nội dung HTML bên trong thành bất kỳ nội dung nào được cung cấp (mà tôi cho rằng bất kỳ mã HTML nào cũng được phân tích cú pháp) và sau đó yêu cầu tất cả nội dung văn bản của div, bỏ qua HTML đã nói .
jsdw 14/03/13

trong trình duyệt của tôi, đối tượng không có trườnginnerText
Adrian

@Adrian dòng cuối cùng sẽ chọn đầu ra temp.textContentnếu nó tồn tại và chỉ thử temp.innerTextnếu nó không tồn tại . Trình duyệt của bạn nên có trước đây, nhưng đối với các trình duyệt mà không làm, sau này được sử dụng thay :)
jsdw

Sau khi xem xét điều này một lần nữa (có rất nhiều câu trả lời ngoài kia). Tôi đang sử dụng phương pháp này. Đây là phương pháp tương tự được sử dụng trong text-angle. Họ đã bổ sung thêm một vài tính năng bổ sung mà tôi đã bao gồm trong chủ đề này
Rentering.com

Giải pháp này không thành công đối với tôi, tôi đang sử dụng @kolkov Text Editor cho Angular.
Waseem Ahmad Naeem

10

Điều này đã làm việc cho tôi.

   var regex = /(&nbsp;|<([^>]+)>)/ig
      ,   body = tt
     ,   result = body.replace(regex, "");
       alert(result);

5
+1 cảm ơn. một lớp lót này hoàn hảo cho nhu cầu của tôi. console.log( my_html.replace(/(&nbsp;|<([^>]+)>)/ig, "") );
DaveAlger

6

Đây là cách TextAngular (WYSISYG Editor) đang làm việc đó. Tôi cũng thấy đây là câu trả lời phù hợp nhất, đó là KHÔNG CÓ ĐĂNG KÝ.

@license textAngular
Author : Austin Anderson
License : 2013 MIT
Version 1.5.16
// turn html into pure text that shows visiblity
function stripHtmlToText(html)
{
    var tmp = document.createElement("DIV");
    tmp.innerHTML = html;
    var res = tmp.textContent || tmp.innerText || '';
    res.replace('\u200B', ''); // zero width space
    res = res.trim();
    return res;
}

2

bạn có thể sử dụng một thư viện mạnh mẽ để quản lý Chuỗi là undrescore.string.js

_('a <a href="#">link</a>').stripTags()

=> 'một liên kết'

_('a <a href="#">link</a><script>alert("hello world!")</script>').stripTags()

=> 'a linkalert ("hello world!")'

Đừng quên nhập lib này như sau:

        <script src="underscore.js" type="text/javascript"></script>
        <script src="underscore.string.js" type="text/javascript"></script>
        <script type="text/javascript"> _.mixin(_.str.exports())</script>

2
Tôi đã xem xét nguồn và họ thực sự sử dụng cùng một regex được đề xuất trong câu trả lời khác trong nội bộ.
eugene

2

thư viện JavaScript đơn giản của tôi được gọi là FuncJS có một hàm được gọi là "strip_tags ()" thực hiện nhiệm vụ cho bạn - mà không yêu cầu bạn nhập bất kỳ biểu thức chính quy nào.

Ví dụ: giả sử bạn muốn xóa các thẻ khỏi một câu - với chức năng này, bạn có thể thực hiện đơn giản như sau:

strip_tags("This string <em>contains</em> <strong>a lot</strong> of tags!");

Điều này sẽ tạo ra "Chuỗi này chứa rất nhiều thẻ!".

Để hiểu rõ hơn, vui lòng đọc tài liệu tại GitHub FuncJS .

Ngoài ra, nếu bạn muốn, vui lòng cung cấp một số phản hồi thông qua biểu mẫu. Nó sẽ rất hữu ích cho tôi!


Bạn có thể cung cấp những gì strip_tags()không thay vì chỉ quảng cáo thư viện của bạn và không giải thích nó? Liên kết giải thích cách sử dụng API nhưng không giải thích những gì nó làm .
Justin Beaudry

1
tốt, đã tìm thấy nó trên trang web mà anh ấy đã đưa,strip_tags = function(e) { var _hasTag, _tag_string; if (!(e === void 0 || e === null || e === "")) { _tag_string = e; if (typeof _tag_string === "object") { _tag_string = _tag_string.outerHTML; } _hasTag = _tag_string.match(/(<([^>]+)>)/ig); if (_hasTag) { return trim(_tag_string.replace(/(<([^>]+)>)/ig, '')); } else { return trim(_tag_string); } } else { throw new Error("The 'strip_tags' function expects one argument in the form of a string or object."); } };
Predrag Stojadinović

1

Đây là một giải pháp cho thẻ HTML và & nbsp, v.v. và bạn có thể xóa và thêm các điều kiện để lấy văn bản mà không có HTML và bạn có thể thay thế bằng bất kỳ.

convertHtmlToText(passHtmlBlock)
{
   str = str.toString();
  return str.replace(/<[^>]*(>|$)|&nbsp;|&zwnj;|&raquo;|&laquo;|&gt;/g, 'ReplaceIfYouWantOtherWiseKeepItEmpty');
}


0
<html>
<head>
<script type="text/javascript">
function striptag(){
var html = /(<([^>]+)>)/gi;
for (i=0; i < arguments.length; i++)
arguments[i].value=arguments[i].value.replace(html, "")
}
</script>
</head> 
<body>
       <form name="myform">
<textarea class="comment" title="comment" name=comment rows=4 cols=40></textarea><br>
<input type="button" value="Remove HTML Tags" onClick="striptag(this.form.comment)">
</form>
</body>
</html>

0

Câu trả lời đã chọn không phải lúc nào cũng đảm bảo rằng HTML bị loại bỏ, vì vẫn có thể tạo một chuỗi HTML không hợp lệ thông qua nó bằng cách tạo một chuỗi như sau.

  "<<h1>h1>foo<<//</h1>h1/>"

Đầu vào này sẽ đảm bảo rằng việc loại bỏ tập hợp một tập hợp các thẻ cho bạn và sẽ dẫn đến:

  "<h1>foo</h1>"

Ngoài ra, chức năng văn bản của jquery sẽ tách văn bản không được bao quanh bởi các thẻ.

Đây là một hàm sử dụng jQuery nhưng sẽ mạnh hơn đối với cả hai trường hợp này:

var stripHTML = function(s) {
    var lastString;

    do {            
        s = $('<div>').html(lastString = s).text();
    } while(lastString !== s) 

    return s;
};

0

Cách tôi làm thực tế là một lớp lót.

Hàm tạo một đối tượng Range và sau đó tạo một DocumentFragment trong Range với chuỗi là nội dung con.

Sau đó, nó lấy văn bản của phân đoạn, loại bỏ mọi ký tự "vô hình" / không độ rộng và cắt nó khỏi bất kỳ khoảng trắng nào ở đầu / cuối.

Tôi nhận ra câu hỏi này đã cũ, tôi chỉ nghĩ rằng giải pháp của tôi là duy nhất và muốn chia sẻ. :)

function getTextFromString(htmlString) {
    return document
        .createRange()
        // Creates a fragment and turns the supplied string into HTML nodes
        .createContextualFragment(htmlString)
        // Gets the text from the fragment
        .textContent
        // Removes the Zero-Width Space, Zero-Width Joiner, Zero-Width No-Break Space, Left-To-Right Mark, and Right-To-Left Mark characters
        .replace(/[\u200B-\u200D\uFEFF\u200E\u200F]/g, '')
        // Trims off any extra space on either end of the string
        .trim();
}

var cleanString = getTextFromString('<p>Hello world! I <em>love</em> <strong>JavaScript</strong>!!!</p>');

alert(cleanString);

-1

Giống như những người khác đã nêu, regex sẽ không hoạt động. Hãy dành một chút thời gian để đọc bài viết của tôi về lý do tại sao bạn không thể và không nên cố gắng phân tích cú pháp html bằng regex, đó là điều bạn đang làm khi cố gắng tách html khỏi chuỗi nguồn của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.