从字符串中去除标签 - HTML5 [重复]

Posted

技术标签:

【中文标题】从字符串中去除标签 - HTML5 [重复]【英文标题】:Strip tags from a string - HTML5 [duplicate] 【发布时间】:2015-08-31 20:10:21 【问题描述】:

以下字符串是 HTM5 中的有效 html,即使属性中带有 >

'<span src="whatever.png" data-info="hello>there">text</span>';

几乎allsolutionsproposed在使用以下变体之前:

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

由于属性中的&gt; 而失败。

还可以选择将内容写入虚拟元素,然后读回textContent,但在处理大量数据时速度非常慢。

所以,我想知道是否有人有任何建议?删除属性 - 或者至少是在第一遍正则表达式中删除带有匹配引号的属性值,然后第二遍去除标签似乎是要走的路,但我无法完全理解它!

【问题讨论】:

正则表达式引擎不是词法分析器。它不是为做这些事情而设计的,并且通常在边缘情况下失败。你的只是一个例子。此外,如果您正在寻找速度,那么正则表达式无论如何都不是要走的路。自己解析。 正确的答案是不使用正则表达式。但是,根据您的预期输入,您可能能够完成它。例如,对于您的特定示例,您可以查找&gt;&lt;/ 之间的文本,但这不是一个通用的解决方案。使用实际的 html 解析器。 而使用 Jquery,这就像$('&lt;span src="whatever.png" data-info="hello&gt;there"&gt;text&lt;/span&gt;').text() 一样简单。但也许您可以详细说明您在writing the content to a dummy element and then reading back the textContent 时尝试做什么以及您定义为“非常慢”以及什么是“大量数据”? 另一种方式:jsfiddle.net/quhpek00/2 至少你可以将它链接到一个有一半机会的正则表达式(不是那个糟糕的)。 &lt;(?:(?:/?\w+\s*/?)|(?:\w+\s+(?:(?:(?:"[\S\s]*?")|(?:'[\S\s]*?'))|(?:[^&gt;]*?))+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))&gt; 【参考方案1】:

我相信这个正则表达式应该适用于您的目的:

/<([^\"\'>]*|\"([^"\\]|\\.)*\"|\'([^'\\]|\\.)*\')*>/g

基本上,它匹配除"'&gt; 之外的任何字符,或者它匹配"' 后跟任何字符,后跟另一个"'

只需以与原始问题相同的方式使用它 - string.replace(/&lt;([^\"\'&gt;]*|\"([^"\\]|\\.)*\"|\'([^'\\]|\\.)*\')*&gt;/g, '');

【讨论】:

这不起作用。 "&lt;span&gt;test&lt;/span&gt;".replace(/&lt;([^\"\'&gt;]*|\"[^"]*\"|\'[^']*\')*&gt;/, ''); => "test&lt;/span&gt;" @meagar 抱歉,我忘了在示例中添加全局标志。它现在应该可以工作了。 还是不行。 '&lt;span src="\\"what"&gt;test&lt;/span&gt;'.replace(/&lt;([^\"\'&gt;]*|\"[^"]*\"|\'[^']*\')*&gt;/g, ''); => "&lt;span src="\"what"&gt;test" @meagar 我再次对其进行了更新以考虑转义变量(尽管在制作该正则表达式时它们甚至没有出现在我的脑海中)

以上是关于从字符串中去除标签 - HTML5 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法从字符串中去除空格[重复]

在Python中从字符串中去除数字[重复]

在Java中剥离HTML标签[重复]

在java中去除新行和回车[重复]

html5 - 无法将`\n`格式化为渲染字符串中的新行[重复]

如何使用 jQuery 去除 HTML 标签?