Hapus Tag HTML di Javascript dengan Regex


108

Saya mencoba untuk menghapus semua tag html dari sebuah string di Javascript. Inilah yang saya miliki ... Saya tidak tahu mengapa tidak berhasil .... ada yang tahu apa yang saya lakukan salah?

<script type="text/javascript">

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

</script>

Terima kasih banyak!

Jawaban:


237

Coba ini, perhatikan bahwa tata bahasa HTML terlalu rumit untuk 100% benar untuk ekspresi reguler:

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

console.log(result);

Jika Anda ingin menggunakan pustaka seperti jQuery , Anda cukup melakukan ini:

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

2
Mengapa Anda membungkus ekspresi reguler dalam sebuah string? var regex = / (<([^>] +)>) / ig;
brianari

Ini tidak akan berhasil. Secara khusus, ini akan gagal pada tag pendek: is-thought.co.uk/book/sgml-9.htm#SHORTTAG
Mike Samuel

4
Ini adalah pertanyaan lama, tetapi saya akan memposting ini di sini: jsperf.com/regex-replace-vs-jquery-text
Joshua

2
Coba jalankan ini "<img src=bogus onerror=alert(1337)". Yang pertama gagal karena parser HTML tidak mengharuskan tag terakhir ditutup oleh a >, dan yang kedua gagal karena pemuatan gambar dimulai bahkan sebelum pohon DOM yang diurai ditambahkan ke DOM, dan $('<img ...>')memanggil parser HTML.
Mike Samuel

1
Solusi regex juga akan gagal jika a >disertakan dalam nilai atribut; seperti ini<div data="a + b > c">
MT0

34

Ini adalah pertanyaan lama, tetapi saya menemukan itu dan berpikir saya akan membagikan metode yang saya gunakan:

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 sekarang akan berisi: "some text and some more text"

Sederhana, tidak perlu jQuery, dan tidak akan mengecewakan Anda bahkan dalam kasus yang lebih kompleks.


Hai. Nah, pada dasarnya semua yang dilakukannya adalah membuat DIV baru, mengatur konten HTML bagian dalam ke apa pun yang disediakan (yang saya asumsikan berarti kode HTML apa pun diurai), dan kemudian meminta semua konten teks div, yang mengabaikan HTML tersebut. .
jsdw

di browser saya, objek tidak memiliki bidanginnerText
Adrian

@Adrian baris terakhir akan memilih keluaran temp.textContentjika ada, dan hanya mencoba temp.innerTextjika tidak ada. Browser Anda harus memiliki yang pertama, tetapi untuk browser yang tidak, yang terakhir digunakan sebagai gantinya :)
jsdw

Setelah melihat ini lagi (ada begitu banyak jawaban di luar sana). Saya menggunakan metode ini. Ini adalah metode yang sama yang digunakan dalam text-angular. Mereka telah menambahkan beberapa tambahan yang telah saya sertakan di utas ini
Rentering.com

Solusi ini gagal untuk saya, saya menggunakan @kolkov Text Editor for Angular.
Waseem Ahmad Naeem

10

Ini berhasil untuk saya.

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

5
+1 terima kasih. liner yang satu ini dibangun sempurna untuk kebutuhan saya. console.log( my_html.replace(/(&nbsp;|<([^>]+)>)/ig, "") );
DaveAlger

6

Berikut adalah cara TextAngular (WYSISYG Editor) melakukannya. Saya juga menemukan ini sebagai jawaban yang paling konsisten, yaitu TANPA REGEX.

@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

Anda dapat menggunakan perpustakaan yang kuat untuk manajemen String yaitu undrescore.string.js

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

=> 'tautan'

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

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

Jangan lupa untuk mengimpor lib ini sebagai berikut:

        <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
Saya melihat sumbernya, dan mereka benar-benar menggunakan regex yang sama yang disarankan dalam jawaban lain secara internal.
eugene

2

Pustaka JavaScript sederhana saya bernama FuncJS memiliki fungsi yang disebut "strip_tags ()" yang melakukan tugas untuk Anda - tanpa mengharuskan Anda memasukkan ekspresi reguler.

Misalnya, Anda ingin menghapus tag dari sebuah kalimat - dengan fungsi ini, Anda dapat melakukannya seperti ini:

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

Ini akan menghasilkan "String ini berisi banyak tag!".

Untuk pemahaman yang lebih baik, silakan baca dokumentasi di GitHub FuncJS .

Selain itu, jika Anda mau, berikan umpan balik melalui formulir. Itu akan sangat membantu saya!


Bisakah Anda memberikan apa yang strip_tags()bukan hanya mempromosikan perpustakaan Anda dan tidak menjelaskannya? Tautan menjelaskan penggunaan API tetapi tidak menjelaskan fungsinya .
Justin Beaudry

1
baik, menemukannya di situs web yang dia berikan,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

Ini adalah solusi untuk tag HTML dan & nbsp dll dan Anda dapat menghapus dan menambahkan ketentuan untuk mendapatkan teks tanpa HTML dan Anda dapat menggantinya dengan apa pun.

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

Jawaban yang dipilih tidak selalu memastikan bahwa HTML dihilangkan, karena masih mungkin untuk membuat string HTML yang tidak valid melaluinya dengan membuat string seperti berikut.

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

Masukan ini akan memastikan bahwa stripping menyusun satu set tag untuk Anda dan akan menghasilkan:

  "<h1>foo</h1>"

Selain itu, fungsi teks jquery akan menghapus teks yang tidak dikelilingi oleh tag.

Berikut adalah fungsi yang menggunakan jQuery tetapi harus lebih kuat terhadap kedua kasus ini:

var stripHTML = function(s) {
    var lastString;

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

    return s;
};

0

Cara saya melakukannya praktis satu baris.

Fungsi membuat objek Range dan kemudian membuat DocumentFragment di Range dengan string sebagai konten anak.

Kemudian ia mengambil teks dari fragmen, menghapus karakter "tak terlihat" / lebar-nol, dan memotongnya dari spasi kosong di depan / di belakang.

Saya menyadari pertanyaan ini sudah lama, saya hanya mengira solusi saya unik dan ingin dibagikan. :)

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

Seperti yang dinyatakan orang lain, regex tidak akan berfungsi. Luangkan waktu sejenak untuk membaca artikel saya tentang mengapa Anda tidak dapat dan tidak boleh mencoba mengurai html dengan regex, yang Anda lakukan saat mencoba untuk menghapus html dari string sumber Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.