2015-10-15 33 views
1

我在这里挣扎,试图弄清楚如何替换所有在特定单词后面出现的双斜线。正则表达式删除特定单词之后的重复斜线(VBScript/Classic ASP)

例子:

<img alt="" src="/pt/webf//2015//47384_1.JPG" height="235" width="378" /> 
<div>Don't remove this // or this//</div> 

我想上面的字符串是这样的:

<img alt="" src="/pt/webf/2015/47384_1.JPG" height="235" width="378" /> 
<div>Don't remove this // or this//</div> 

注意双斜杠已经被替换为img标签只是一个斜线,但在离开毫发无损div标签。我只想替换双斜杠,如果它们出现在单词后面:pt

我想是这样的:

(?=pt)((.*?)\/\/)+ 

然而,第一件事情错了,是(?=)不做模式回溯,据我所知。也就是说,它只会查找第一个匹配模式。错误的第二件事是它不按我的意图工作。

https://regex101.com/r/kC4tA5/1

或者,也许我会对此错误的方式,因为正则表达式的支持是不是在VBScript/ASP经典膨胀,我应该试图打破了绳子和过程,而不是试图做一切正则表达式中的一切?

任何帮助,将不胜感激。

谢谢。

+1

破碎的HTML从哪里来?源可以修复吗? – Tomalak

+0

它是VBscript的一部分,它从大量文件中读取某些HTML标记的片段(我没有编写脚本)。我可以更正实际的文件,但这些文件是由用户创建的,因此可能会一次又一次地弹出,这就是为什么我试图解决用户ID10T错误的原因。事实上,可能有多个这样的文件。到目前为止只有一个。也许我最好使用VBScript来分解代码片段,应用正则表达式,然后重新组合起来,这可以安全地说出来吗? – user3621633

+0

我认为它的工作方式是按照预期工作的,其中最重要的是你只能捕获最后一次迭代,按照“解释”窗格中的注释:'注意:重复捕获组将只捕获最后一次迭代。将一个捕获组放在重复组中,以捕获所有迭代,或者使用非捕获组,而不是对数据不感兴趣。 –

回答

3

我正在将您的问题解释为“在所有<img src>属性中删除重复的斜杠”。

正如我在评论中所说的,使用HTML需要解析器。 HTML对于正则表达式来说太复杂了,各种各样的东西都可能出错。

幸运的是,有一个解析器可用于VBScript:htmlfile对象。它从你的HTML字符串中创建一个标准的DOM。因此,溶液变得精确描述:

Function FixHtml(htmlString) 
    Dim doc, img, slashes 

    Set slashes = New RegExp 
    slashes.Pattern = "/+" 
    slashes.Global = True 

    Set doc = CreateObject("htmlfile") 
    doc.Write htmlString 

    For Each img In doc.getElementsByTagName("IMG") 
     img.src = slashes.Replace(img.src, "/") 
     img.src = Replace(Replace(img.src, "about:blank", ""), "about:", "") 
    Next 

    FixHtml = doc.body.innerHTML 
End Function 

不幸的是,htmlfile是不是世界上最先进的HTML解析器,但放心,它仍然会做的方式比任何正则表达式更好。

有两个小问题:

  1. 我在测试中发现,由于某种原因,坚持用about:about:blank前面加上img.src。这不应该发生,但它确实如此。 Replace()调用的第二行排除了不需要的添加。

  2. .innerHTML将产生大写的标签名称,因此在输出中<img>变为<IMG>。也可以删除HTML源代码中不重要的换行符。这是一个小小的烦恼,我建议你不要迷恋它。(*)

但有两个大加双方还有:

  1. 的DOM让你在一个位置,你可以在一个结构化的方式与输入工作。现在,您可以输入任何数量的复杂修复,这对于正则表达式来说是不可能的。
  2. .innerHTML的返回值是理智的HTML。它将修正输入中的任何严重错误,并将其转化为嵌套良好,逃脱良好以及其他表现良好的内容。

(*)如果你发现自己沉迷在这,你可以使用智慧this blog post创建替换出来的.innerHTML有自己的小写版本的所有大写标签的功能。这实际上是你可以使用正则表达式(准确地说是"(</?[A-Z]+)"),因为我们知道,将不会有任何遗漏<不属于字符串中任何地方的标记,因为这是.innerHTML的保证。虽然这将是一个很好的练习(并且它会向您介绍VBScript具有函数指针的鲜为人知的事实),但我认为这并不值得。

+0

这实际上相当出色。谢谢。最困难的部分是它并不总是“img”。但我猜这不是很糟糕。只需梳理文件并根据需要查找适用的所有标签类型并修改上述功能。再次感谢。 – user3621633

+1

您可以使用'.getElementsByTagName(“*”)'来获取所有元素。有许多方法可以[迭代属性](http://stackoverflow.com/questions/828311/how-to-iterate-through-all-attributes-in-an-html-element)。看看我刚刚添加的脚注。 – Tomalak

+0

感谢您的博客文章参考。脚本(同样,不是我的手脚)实际上在适用于处理的每个片段上使用'lcase'VBScript函数。所以,一切都变成小写。但总的来说,该博客主题可能会有帮助。再次感谢。 – user3621633

相关问题