如何从html字符串(包括文本)中删除所有内容,但保留所有<;a>;标记及其数据是否使用regex保持完整?

如何从html字符串(包括文本)中删除所有内容,但保留所有<;a>;标记及其数据是否使用regex保持完整?,html,regex,string,Html,Regex,String,首先,我想对比我更有经验的人说,这必须在regex中完成。由于奇怪的情况,无法访问DOM解析器 因此,我有一个完整的HTML/XHTML字符串,并希望从中删除除链接以外的所有内容。基本上就是 谢谢大家的帮助 正则表达式看起来像这样 /\<\a.*[\/]{0,1}>(.*<\/\a>){0,1}/gm /\(.*){0,1}/gm result=subject.match(/|>(?:(?!))*)/ig); 获取HTML源中所有标记的数组(即使是自关闭的标记,这些标

首先,我想对比我更有经验的人说,这必须在regex中完成。由于奇怪的情况,无法访问DOM解析器

因此,我有一个完整的HTML/XHTML字符串,并希望从中删除除链接以外的所有内容。基本上就是


谢谢大家的帮助

正则表达式看起来像这样

/\<\a.*[\/]{0,1}>(.*<\/\a>){0,1}/gm
/\(.*){0,1}/gm
result=subject.match(/|>(?:(?!))*)/ig);
获取HTML源中所有
标记的数组(即使是自关闭的标记,这些标记是非法的,但您特别要求)。这是否足够

说明:

<a         # Match <a
[^<>]*?    # Match any characters besides angle brackets, as few as possible
(?:        # Now either match
 />        # /> (self-closed tag)
|          # or 
 >         # a closing angle bracket
 (?:       # followed by...
  (?!</a>) # (if we're not at the closing tag)
  .        # any character
 )*        # any number of times
 </a>      # until the closing tag
)
(自动关闭标签)
|#或
>#闭合角支架
(?:#后接。。。
(?!)#(如果我们不在最后关头)
.#任何字符
)*#任意次数
#直到结束标记
)

当然,您可以在Firefox扩展中解析HTML。看一看,尤其是第三条路

它可能看起来更复杂,但它不像正则表达式那样容易出错


一旦您有了对解析内容的引用,您所要做的就是调用
ref.getElementsByTagName('a')
,您就完成了。

这几乎是不可能的。什么是完整的HTML字符串?删除元素后,您希望如何处理字符串?每个浏览器都有一个HTML解析器;)在HTML中,需要一个end
标记。我正在进行一个ajax调用并返回完整的HTML页面。我在firefox扩展中这样做,所以这会让它变得更加困难。想法是获取html ajax响应,将其转储到一个隐藏字段中,然后我就可以访问它的元素。@Daniel,到目前为止,我的方法包括字符串脚本、img和head标记。但我宁愿把所有东西都剥光,只带上链接标签!到目前为止:data=data.replace(/(?:.|\n |\r)+?/ig,“”);数据=数据。替换(/]*(?:\/>|>[\S\S]*?]*>)/ig,“”;doc.getElementById('123')。innerHTML=数据;这是否适用于replace()函数?类似于htmlstring.replace(/\.*/gm,“”)的内容;这匹配所有和值,所以你可以替换它们,是的。对不起,我想我说错了,我想这样会删除所有链接,而不是删除除链接以外的所有内容!我搞糊涂了吗?在你得到链接数组后,你可以将它们粘贴到一个新的字符串中,这样你就可以删除所有不需要的内容,只保留链接我尝试过的匹配项,但我认为如果我把它作为一个字符串,我可以将其转储到div的innerHTML中,这是可能的吗?不使用regex。您无法将“a标记之外的所有文本”与JavaScript正则表达式(无查找断言)匹配。您可以编写类似于
result=subject.replace(/(|>(?:(!))*)。/g,$1')-但这有点毫无意义,真的-您可以更轻松地连接匹配的链接:
result=result.join(“”)
@kobi,这很好,除了它也会删除一些链接。我不明白为什么,但如果它可以调整,以保持所有的链接,那么这将是伟大的!可能吗@阿米尔-上面的模式有一个小问题-尝试用
[\s\s]
替换
(在
#任何字符
)在JavaScript中,我们没有
/s
标志,而且
从不匹配换行符。您可能正在丢失此类链接(或属性中包含
的链接,但这些链接很难)。它应该看起来像
result=subject.replace(/(|>(?:(?!)[\s\s])*))|[^@Amir:如果您仍然使用jQuery,那么您可以使用
$(htmlStr)
我想。因为我不知道HTML,所以我无法告诉你选择器是否正确。是的,如果我的代码是HTML页面的一部分,我会同意它是有效的,但是使用firefox扩展时smae代码失败。请看一下我在这之前的最后一个问题。我想这会让问题变得更清楚。@Amir:在firefox exte中使用jQuery很好扩展可能很棘手(因为浏览器DOM和网站DOM之间存在差异)。我建议将数据加载到iframe中,如我链接到的文章所示,然后使用
querySelectorAll
选择所需的元素。
<a         # Match <a
[^<>]*?    # Match any characters besides angle brackets, as few as possible
(?:        # Now either match
 />        # /> (self-closed tag)
|          # or 
 >         # a closing angle bracket
 (?:       # followed by...
  (?!</a>) # (if we're not at the closing tag)
  .        # any character
 )*        # any number of times
 </a>      # until the closing tag
)