正则表达式去除所有 html 除了背景样式 url

Regex strip all html except background style url

我有以下 regex 可以在我的 HTML 中找到所有背景样式 URL。我正在尝试去除除背景图片 URL 之外的所有 HTML。我的目标是从我的 HTML 页面中抽象出一个背景图片 URL 列表。

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

示例HTML

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

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

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

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

一般修改

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

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

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

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

有点多,但至少在 sublime text 中是值得的。

使用

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

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

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

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

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

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

并将所有内容替换为 \n

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

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

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

第一步

替换

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

>-BG-URL:\n.

>-BG-URL: 是表示值并将它们与其他值区分开来的东西。

第二步

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

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