2012-01-05 79 views
1

我使用此代碼去除所有標籤,但我不想保存一些標籤等等......我該怎麼辦? 我不明白我怎麼可以過濾標籤在JavaScript中使用允許標籤的PHP的等效strip_tags

/*************************************************** 
    STRIP HTML TAGS 
    ****************************************************/ 
    function strip_tags(html){ 

     //PROCESS STRING 
     if(arguments.length < 3) { 
      html=html.replace(/<\/?(?!\!)[^>]*>/gi, ''); 
     } else { 
      var allowed = arguments[1]; 
      var specified = eval("["+arguments[2]+"]"); 
      if(allowed){ 
       var regex='</?(?!(' + specified.join('|') + '))\b[^>]*>'; 
       html=html.replace(new RegExp(regex, 'gi'), ''); 
      } else{ 
       var regex='</?(' + specified.join('|') + ')\b[^>]*>'; 
       html=html.replace(new RegExp(regex, 'gi'), ''); 
      } 
     } 

     //CHANGE NAME TO CLEAN JUST BECAUSE 
     var clean_string = html; 

     //RETURN THE CLEAN STRING 
     return clean_string; 

**編輯* * ** 這是我的HTML代碼

<body class="portrait" onLoad="prepareImages()"> 
    <div id="title_wrapper"><h2 id="title"><a href="[[[LINK]]]">[[[TITLE]]]</a></h2></div> 
    <h2 id="subtitle">[[[DATE]]]</h2> 
    <div id="content"> 
     [[[FULL CONTENT]]] etc.... 
    </div> 

我在這個使用你的函數(我必須替換的是:[[[FULL CONTENT]]]等...)

(strip_tags(contentElem,"<img>"); 

沒有結果。我怎麼能用[[[FULL CONTENT]]]等來重寫[[[FULL CONTENT]]]等....沒有html標籤除外?

+0

僅供參考,請勿使用正則表達式,因爲[bad things](https://stackoverflow.com/a/1732454/266535)將會發生 – styfle 2017-09-13 15:32:25

回答

4

Eval?呃,那真是醜陋的代碼。它通過使用正則表達式模式匹配所有標籤。

  • 如果函數調用的參數少於3個參數,它只會去掉所有的標籤。
  • 如果函數調用具有至少3個參數:
    • 第三個參數是像"a", "b", "strong"的字符串。報價是必需的,這要歸功於醜陋的 evil eval構造。
    • 如果第二參數是一個真值(true例如),第三個參數是允許
    • 如果第二參數是假值(false例如)標記列表,第三個參數是被拒絕

如果你需要一個適當的strip_tags功能的標籤列表,看看http://phpjs.org/functions/strip_tags:535

+0

+1 for php.js :-) – 2012-01-05 19:15:57

+0

編輯我的問題! – 2012-01-06 00:48:43

+0

@UsiUsi我假設你熟悉PHP和它的[strip_tags](http://php.net/strip-tags)函數。你到底想要達到什麼目標?替換文本的一部分*或*替換頁面的內容? – Lekensteyn 2012-01-06 09:48:49

0

下面是用strip_tags()以允許標籤(從phpjs.org) 。

// allow can be a string like '<b><i>' 
function strip_tags(str, allow) { 
    // making sure the allow arg is a string containing only tags in lowercase (<a><b><c>) 
    allow = (((allow || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(''); 

    var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi; 
    var commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi; 
    return str.replace(commentsAndPhpTags, '').replace(tags, function ($0, $1) { 
    return allow.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : ''; 
    }); 
} 
+1

我不能用這個來識別換行符\ n' – 2012-12-22 03:15:24

+0

我看到這個函數全部結束了。至少可以擺脫commentsAndPhpTags部分。 – backdesk 2014-07-31 16:32:57

-1

如果您使用DOM,此操作更爲簡單。我不知道爲什麼人們試圖爲此使用正則表達式。

/** 
* Removes all tags with the provided tagName. 
* @param {Element} el The root element. 
* @param {string} tagName The tagName to match. 
* @example 
* >> document.body.innerHTML; 
* "<p><img src="foo.jpg">Some <strong>text</strong></p>" 
* >> stripTags(document.body, 'img'); 
* undefined 
* >> document.body.innerHTML; 
* "<p>Some <strong>text</strong></p>" 
* >> stripTags(document.body, 'strong'); 
* undefined 
* >> document.body.innerHTML; 
* "<p>Some text</p>" 
*/ 
function stripTags(el, tagName) { 
    var els = el.getElementsByTagName(tagName.toUpperCase()); 
    for (var i = 0; i < els.length; i++) { 
    while (els[i].firstChild) 
     els[i].parentNode.insertBefore(els[i].removeChild(els[i].firstChild), els[i]); 
    els[i].parentNode.removeChild(els[i--]); 
    } 
} 

這將刪除所有標籤(不是它們的內容),我認爲這是strip_tags的行爲方式。

相關問題