从字符串中去除标签 - 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, '' )
由于属性中的>
而失败。
还可以选择将内容写入虚拟元素,然后读回textContent
,但在处理大量数据时速度非常慢。
所以,我想知道是否有人有任何建议?删除属性 - 或者至少是在第一遍正则表达式中删除带有匹配引号的属性值,然后第二遍去除标签似乎是要走的路,但我无法完全理解它!
【问题讨论】:
正则表达式引擎不是词法分析器。它不是为做这些事情而设计的,并且通常在边缘情况下失败。你的只是一个例子。此外,如果您正在寻找速度,那么正则表达式无论如何都不是要走的路。自己解析。 正确的答案是不使用正则表达式。但是,根据您的预期输入,您可能能够完成它。例如,对于您的特定示例,您可以查找>
和</
之间的文本,但这不是一个通用的解决方案。使用实际的 html 解析器。
而使用 Jquery,这就像$('<span src="whatever.png" data-info="hello>there">text</span>').text()
一样简单。但也许您可以详细说明您在writing the content to a dummy element and then reading back the textContent
时尝试做什么以及您定义为“非常慢”以及什么是“大量数据”?
另一种方式:jsfiddle.net/quhpek00/2
至少你可以将它链接到一个有一半机会的正则表达式(不是那个糟糕的)。 <(?:(?:/?\w+\s*/?)|(?:\w+\s+(?:(?:(?:"[\S\s]*?")|(?:'[\S\s]*?'))|(?:[^>]*?))+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>
【参考方案1】:
我相信这个正则表达式应该适用于您的目的:
/<([^\"\'>]*|\"([^"\\]|\\.)*\"|\'([^'\\]|\\.)*\')*>/g
基本上,它匹配除"
、'
或>
之外的任何字符,或者它匹配"
或'
后跟任何字符,后跟另一个"
或'
。
只需以与原始问题相同的方式使用它 - string.replace(/<([^\"\'>]*|\"([^"\\]|\\.)*\"|\'([^'\\]|\\.)*\')*>/g, '');
【讨论】:
这不起作用。"<span>test</span>".replace(/<([^\"\'>]*|\"[^"]*\"|\'[^']*\')*>/, '');
=> "test</span>"
@meagar 抱歉,我忘了在示例中添加全局标志。它现在应该可以工作了。
还是不行。 '<span src="\\"what">test</span>'.replace(/<([^\"\'>]*|\"[^"]*\"|\'[^']*\')*>/g, '');
=> "<span src="\"what">test"
@meagar 我再次对其进行了更新以考虑转义变量(尽管在制作该正则表达式时它们甚至没有出现在我的脑海中)以上是关于从字符串中去除标签 - HTML5 [重复]的主要内容,如果未能解决你的问题,请参考以下文章