【问题标题】:Regex strip all html except background style url正则表达式去除除背景样式 url 之外的所有 html
【发布时间】:2015-08-18 12:13:36
【问题描述】:

我有以下regex,它将在我的 HTML 中找到所有背景样式 URL。我正在尝试剥离除背景图像 URL 之外的所有 HTML。我的目标是从我的 HTML 页面中提取背景图像 URL 列表。

表达式URL\(\s*(['"]?)(.*?)\1\s*\)

示例 HTML

<a href="#"><img style="background-image: url(http://domain.com/2003-Th.jpg)"></a>

我只想做这个表达式的 not。

【问题讨论】:

  • 大多数编码语言都有一个正确答案的 HTML 解析器。正则表达式可用于此目的,但在大多数情况下不应使用。
  • 你想在哪里做这个或用什么语言?同样从上面的代码输出应该是http://domain.com/2003-Th.jpg?
  • 尝试在 netbeans ide 中直接使用正则表达式替换所有。

标签: regex html-parsing


【解决方案1】:

我不知道 netbeans ide,所以这只是一个猜测。

但请注意:您到处搜索url(...)。文本出现在哪里并不重要:在 css 块中、在 html 样式属性中、在 javascript 中,也可以在纯文本和 cmets 中!

一般修改

如果你真的只想包含背景图片,你也应该在你的正则表达式中声明。于是就变成了

\bbackground-image\s*:\s*URL\(\s*(['"]?)(.*?)\1\s*\)

为了加快速度(至少在某些实现中),请尽量防止反向引用。在这种情况下

\bbackground-image\s*:\s*URL\(\s*(?:'([^']+)'|"([^"]+)"|([^)]+))\s*\)

有点多,但至少在崇高的文本中是值得的。

使用

要替换除背景图像中的网址之外的所有内容,您可以使用单个正则表达式

[\s\S]*?\bbackground-image\s*:\s*URL\(\s*(?:'([^']+)'|"([^"]+)"|([^)]+))\s*\)|[\s\S]+

并将所有内容替换为$1$2$3\n。最后(几乎)总是有两个\n,但我认为应该没问题。

这在某些正则表达式引擎中不起作用,其中元素的顺序不是决定性的,而是匹配的长度。

不过如果有问题,可以尝试使用

[\s\S]*?\bbackground-image\s*:\s*URL\(\s*(?:'([^']+)'|"([^"]+)"|([^)]+))\s*\)[\s\S]*?(?=\z|\bbackground-image\s*:\s*URL\(\s*(?:'[^']+'|"[^"]+"|[^)]+)\s*\))

并将所有内容替换为$1$2$3\n

  • [\s\S] 表示每个字符(包括\n
  • \b 是单词边界
  • (?= ... ) 是一个积极的前瞻性。它必须匹配,但不是结果的一部分
  • \z是正文的结尾

(也许你需要稍微调整一下正则表达式以适应 netbeans)

无论如何,并不是每个正则表达式实现都支持前瞻。如果 netbeans 不支持,则必须使用多步骤方法:

第一步

替换

[\s\S]*?\bbackground-image\s*:\s*URL\(\s*(?:'([^']+)'|"([^"]+)"|([^)]+))\s*\)

&gt;-BG-URL:$1$2$3\n.

&gt;-BG-URL: 用于指示值并将它们与其他值区分开来。

第二步

在最后一场比赛之后手动替换所有内容(那时你不需要--BG-URL)或替换

^>-BG-URL:(.*)|^[\s\S]+

$1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    相关资源
    最近更新 更多