【问题标题】:How to strip EVERYTHING from a html string including texts but leave all <a> tags and their data intact using regex?如何从包含文本的 html 字符串中剥离所有内容,但使用正则表达式保留所有 <a> 标记及其数据?
【发布时间】:2011-07-13 10:37:41
【问题描述】:

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

所以我有一个完整的 HTML/XHTML 字符串,并想从中删除除链接之外的所有内容。基本上只有&lt;a&gt; 标签很重要。我需要标签来完整地保存它们的信息,所以 href、target、class 等,如果它是一个自终止标签或者它有一个单独的结束标签,它应该可以工作。即&lt;a /&gt;&lt;a&gt;&lt;/a&gt;

感谢大家的帮助!

【问题讨论】:

  • 这几乎是不可能的。什么是完整的 HTML 字符串?删除元素后,您想对字符串做什么?每个浏览器都有一个 HTML 解析器;)在 HTML 中,结束 &lt;/a&gt; 标记是必需的
  • 即时进行 ajax 调用并获取完整的 html 页面。我在 Firefox 扩展程序中执行此操作,因此变得更加困难。这个想法是获取 html ajax 响应,将其转储到隐藏字段中,然后我可以访问它的元素。
  • @Daniel,到目前为止,我的方式包括将 script 和 img 和 head 标签字符串化。但我宁愿剥离一切,只拥有链接标签!到目前为止: data = data.replace(/(?:.|\n|\r)+?/ig, ""); data = data.replace(/

标签: html regex string


【解决方案1】:

当然,您可以在 Firefox 扩展程序中解析 HTML。看看HTML to DOM,尤其是second和第三种方式。

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

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

【讨论】:

  • @Amir:如果您仍然使用 jQuery,那么我认为您可以使用 $(htmlStr)。由于我不知道 HTML,我无法告诉您选择器是否正确。
  • 是的,如果我的代码是 html 页面的一部分,但 smae 代码在使用 firefox 扩展时会失败,我会这样做。看看我在这个问题之前的最后一个问题。我认为这样会更清楚。
  • @Amir:在 Firefox 扩展中使用 jQuery 可能会很棘手(因为浏览器 DOM 和网站 DOM 之间存在差异)。我建议将数据加载到我链接到的文章中所示的 iframe 中,然后使用querySelectorAll 选择您想要的元素。
【解决方案2】:
result = subject.match(/<a[^<>]*?(?:\/>|>(?:(?!<\/a>).)*<\/a>)/ig);

为您提供 HTML 源代码中所有 &lt;a&gt; 标记的数组(即使是非法但您特别要求的自闭合标记)。够了吗?

说明:

<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
)

【讨论】:

  • 我尝试了 match,但我认为如果我将它作为一个可以转储到 div 的 innerHTML 中的字符串会更好。这可能吗?
  • 不使用正则表达式。您无法将“a 标记之外的所有文本”与 JavaScript 正则表达式匹配(无后向断言)。
  • 你可以写类似result = subject.replace(/(&lt;a[^&lt;&gt;]*?(?:\/&gt;|&gt;(?:(?!&lt;\/a&gt;).)*&lt;\/a&gt;))|./g,'$1');的东西——但这有点没有意义,真的——你可以更容易地连接匹配的链接:result = result.join('');
  • @kobi,这很棒,除了它也删除了一些链接。我不明白为什么,但是如果可以对其进行调整以保留所有链接,那就太好了!可能吗?!
  • @Amir - 上述模式存在一个小问题 - 尝试用 # any character 替换 .(在 # any character 中) - 在 JavaScript 中,我们没有 /s 标志,和 . 从不匹配换行符。您可能会丢失此类链接(或属性中具有 &gt; 的链接,但这些链接很难)。它应该看起来像result = subject.replace(/(&lt;a[^&lt;&gt;]*?(?:\/&gt;|&gt;(?:(?!&lt;\/a&gt;)[\s\S])*&lt;\/a&gt;))|[^&lt;]+/g,'$1');。 (我还将第二个 . 更改为 [^&lt;]+ - 这只是一种优化,它不会解决实际问题。
【解决方案3】:

正则表达式看起来像这样

/\<\a.*[\/]{0,1}>(.*<\/\a>){0,1}/gm

【讨论】:

  • 这是否适用于 replace() 函数?类似 htmlstring.replace(/\.*/gm,"");
  • 这匹配所有的value,所以你可以替换它们,是的。
  • 对不起,我想我说错了,我认为这样会删除所有链接,而不是删除除链接之外的所有其他内容!我很困惑吗?
  • 获得链接数组后,您可以将它们粘贴到新字符串中,这样您就可以删除不需要的所有内容,只保留链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 2011-03-19
相关资源
最近更新 更多