用于删除特定单词后的重复斜线的正则表达式 (VBScript/Classic ASP)

Regular expression to remove repeated slashes that are after a specific word (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/Classic ASP 中并不广泛,我应该尝试分解字符串和处理,而不是尝试在一个正则表达式中完成所有事情???

如有任何帮助,我们将不胜感激。

谢谢。

我将您的问题解释为 "Removing repeated slashes in all <img src> attributes."

正如我在评论中所说,使用 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. 我在测试中发现,出于某种原因,它坚持在 img.src 前面加上 about:about:blank。这不应该发生,但确实发生了。 Replace() 调用的第二行删除了不需要的添加。

  2. .innerHTML 将生成大写的标签名称,因此 <img> 在输出中变为 <IMG>。 HTML 源代码中无关紧要的换行符也可能会被删除。这是一个小烦恼,我建议你不要纠结它。(*)

但也有两大优势:

  1. DOM 使您能够以结构化的方式处理输入。您现在可以添加任意数量的复杂修复程序,而这些修复程序使用正则表达式是不可能做到的。
  2. .innerHTML 的 return 值是合理的 HTML。它将修复输入中的任何严重错误,并将其转化为嵌套良好、转义良好且行为良好的内容。

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