【问题标题】:jQuery (almost) equivalent of PHP's strip_tags()jQuery(几乎)相当于 PHP 的 strip_tags()
【发布时间】:2017-09-29 15:16:45
【问题描述】:

这个函数有 jQuery 版本吗?

字符串 strip_tags( 字符串 $str [, 字符串 $allowable_tags ])

从字符串中去除所有标签和其中的内容,除了在允许的标签字符串中定义的标签和内容。

喜欢:

var stripped = strip_tags($('#text').html(), '<p><em><i><b><strong><code>');

来自:

<div id="text">
  <p> paragraph </p>
  <div> should be stripped </div>
</div>

【问题讨论】:

  • phpjs.org 提供了这个函数的一个端口。
  • 当标签被剥离时,您是否希望它的子元素也被移除?你能澄清一下吗?
  • (所以请在您的问题中明确说明您是想要strip_tags 的行为,还是您认为的行为。:D)
  • 你认为我认为它具有的行为:D 是的,我希望将内容剥离到(包括儿童,如果有的话)

标签: javascript jquery html strip-tags


【解决方案1】:

要删除只是标签,而不是内容,这是 PHP 的 strip_tags() 的行为方式,您可以这样做:

var whitelist = "p"; // for more tags use the multiple selector, e.g. "p, img"
$("#text *").not(whitelist).each(function() {
    var content = $(this).contents();
    $(this).replaceWith(content);
});

Try it out here.

【讨论】:

  • 我已经尝试过 $("*").each()... 这似乎工作正常。除非我错过了什么。
  • 如何在 textareas 上进行这项工作?例如如果我按下一个按钮,那么 textarea 内的所有 html 标签都应该是条纹的。
  • &lt;script&gt; 标签呢?这些未列入白名单,但仍存在于输出中。
  • 非常好的一个。谢谢!
【解决方案2】:

要删除所有可以使用的标签

$('<div>Content</div>').text()

【讨论】:

  • $('dsfsadfasdfasdfasdf&lt;a&gt;sdfsdf&lt;/a&gt;').text() 会给你"sdfsdf" 从而丢失文本的第一部分。
  • 是的,只有当文本包含在某个 html 标签内时它才会起作用
  • $('&lt;p&gt;'+content+'&lt;/p&gt;').text();也是如此
  • .text() 更等同于 PHP htmlspecialchars() 而不是 strip_tags()。示例:outside html - &lt;strong&gt;inside html&lt;/strong&gt; strip_tags 将是 outside html - inside html.text() 将是 outside html - &lt;strong&gt;inside html&lt;/strong&gt; 其中 &amp;lt;&amp;lt;&amp;gt;&amp;gt;
  • XSS 警告:此方法还将解码实体,例如Foo &amp;lt;script&amp;gt;alert('XSS')&amp;lt;/script&amp;gt; &lt;span&gt;Bar&lt;/span&gt; 将变成 Foo &lt;script&gt;alert('XSS')&lt;/script&gt; Bar。 PHP 的 strip_tags 不这样做。
【解决方案3】:

只需使用正则表达式:

html.replace( /<.*?>/g, '' );

完成。 :)

对于p 标签:

html.replace( /<[^p].*?>/g, '' );

对于其他标签,它变得更加复杂。

【讨论】:

  • 换行符打破了这个rx:'&lt;tag\n&gt;'.replace(/&lt;.*?&gt;/g,'') // &lt;tag\n&gt;来克服这个使用[\s\S]而不是点:/&lt;[\s\S]*?&gt;/g
  • ...或/&lt;[^&gt;]*&gt;/g
【解决方案4】:

这对我有用:

function strip_tags(str) {
    str = str.toString();
    return str.replace(/<\/?[^>]+>/gi, '');
}

【讨论】:

  • 投给那个,因为它是唯一没有副作用的解决方案。如果可以的话,我会减半,因为这个功能不允许标签白名单(我不需要)。
【解决方案5】:

不是一个实际的答案,而是一个警告(取决于你想用这个做什么):

恕我直言,在几乎所有的情况下,输入清理应该在服务器端完成(在这种情况下,使用原生 PHP 函数)。如果您的意图是用客户端功能替换 PHP 功能,我会强烈建议不要这样做。

为什么?

仅仅因为您正在创作一个网站,并不意味着:

  1. 您的用户启用了 JavaScript。如果您没有严格通过脚本提交表单(使用提交按钮等),它仍然允许用户提交无效数据(例如
  2. 请求实际上可能根本不是由浏览器发起的,从而绕过了任何基于 JS 的输入清理。

再一次,不是真正回答您的问题,而是根据您的问题可能会导致的问题提出警告:)

【讨论】:

  • 不,我试图让访问者在评论时“引用”cmets。当他们点击引用按钮时,我希望他们引用的评论中的文本出现在 textarea 中,没有标签,因为它可能会吓到他们
  • @Alex - 查看我的答案中链接的示例。我特意为p 标签着色,以强调“白名单”保持不变。保留所有文本。
  • @Alex - 我认为你的意思是接受 karim79 的回答,而不是我的 :)
  • 投了反对票,因为“答案”不是答案,并假设 OP 无知并且不知道他们需要什么。最好先了解为什么有人会根据假设的用例提出反对意见。
  • @mikeschinkel:在事实发生两年后,并不是每天都有人被否决:)
【解决方案6】:

要删除所有标签,可以使用:

var StrippedString = OriginalString.replace(/(<([^>]+)>)/ig,"");

代码来自:Strip HTML Tags in JavaScript

【讨论】:

  • 不需要括号 str.replace(/&lt;[^&gt;]+&gt;/ig, "") 也一样
【解决方案7】:

即使这是一个旧线程,我认为它对那些仍在寻找答案的人可能很有用。

Locutus.io function 似乎是最好的解决方案:

function strip_tags (input, allowed) {
      allowed = (((allowed || '') + '').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 input.replace(commentsAndPhpTags, '').replace(tags, function ($0, $1) {
        return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : ''
      })
}

示例 1:

strip_tags('<p>Kevin</p> <br /><b>van</b> <i>Zonneveld</i>', '<i><b>')

返回 1:'Kevin &lt;b&gt;van&lt;/b&gt; &lt;i&gt;Zonneveld&lt;/i&gt;'

示例 2:

strip_tags('<p>Kevin <img src="someimage.png" onmouseover="someFunction()">van <i>Zonneveld</i></p>', '<p>')

返回 2:'&lt;p&gt;Kevin van Zonneveld&lt;/p&gt;'

示例 3:

strip_tags("<a href='http://kvz.io'>Kevin van Zonneveld</a>", "<a>")

返回 3:"&lt;a href='http://kvz.io'&gt;Kevin van Zonneveld&lt;/a&gt;"

示例 4:

strip_tags('1 < 5 5 > 1')

返回 4:'1 &lt; 5 5 &gt; 1'

示例 5:

strip_tags('1 <br/> 1')

返回 5:'1 1'

示例 6:

strip_tags('1 <br/> 1', '<br>')

返回 6:'1 &lt;br/&gt; 1'

示例 7:

strip_tags('1 <br/> 1', '<br><br/>')

返回 7:'1 &lt;br/&gt; 1'

【讨论】:

    【解决方案8】:

    你可以试试这个,可能是最好的解决方案:http://phpjs.org/functions/strip_tags/

    【讨论】:

      【解决方案9】:

      更新

      在保留内容的同时使用以下内容去除标签

      $('#text').find('p').contents().unwrap();
      

      这将去除p 标记,其中p 是“#text”的子元素。

      http://jsfiddle.net/YWCsH/查看工作示例

      【讨论】:

      • strip_tags 不是这样做的。 OP 说删除标签内部的内容已被删除,但 that's not true.
      • @Hussein:实际上,无论是他的文字还是他的例子都没有说清楚(他只是错误地描述了strip_tags 所做的事情)。我们唯一能做的就是他想要一个strip_tags 的端口,它not 的行为与您的Javascript 一样。
      • 是她。无论她是否正确引用了strip_tags,这都是我从她的问题中理解的。
      • @Hussein:很公平。无论哪种方式,这都是一场赌博:让我们拭目以待。 :)
      • @Alex:对不起;我没有检查你的性别。反射打字。 :)
      猜你喜欢
      • 1970-01-01
      • 2010-11-14
      • 2021-05-03
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 2020-11-04
      相关资源
      最近更新 更多