正则表达式除了背景样式网址之外的所有html

时间:2015-06-04 03:26:54

标签: regex html-parsing

我有以下regex,它会在我的HTML中找到所有背景样式的网址。我试图删除除背景图片网址之外的所有HTML。我的目标是从我的HTML页面中抽象出一个背景图像URL列表。

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

示例HTML

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

我想做的不是这个表达。

1 个答案:

答案 0 :(得分:1)

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

但要注意:你到处搜索url(...)。文本出现的位置无关紧要:在CSS块中,在html样式属性中,在javascript中,还有纯文本和注释!

一般修改

如果您真的只想包含背景图片,那么您也应该在正则表达式中说明。所以它变成

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

>-BG-URL:$1$2$3\n

>-BG-URL:表示值并将其与其他值区分开来。

第二步

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

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

$1