用于删除特定单词后的重复斜线的正则表达式 (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 解析器,但请放心,它仍然会比任何正则表达式做得更好。
有两个小问题:
我在测试中发现,出于某种原因,它坚持在 img.src
前面加上 about:
或 about:blank
。这不应该发生,但确实发生了。 Replace()
调用的第二行删除了不需要的添加。
.innerHTML
将生成大写的标签名称,因此 <img>
在输出中变为 <IMG>
。 HTML 源代码中无关紧要的换行符也可能会被删除。这是一个小烦恼,我建议你不要纠结它。(*)
但也有两大优势:
- DOM 使您能够以结构化的方式处理输入。您现在可以添加任意数量的复杂修复程序,而这些修复程序使用正则表达式是不可能做到的。
.innerHTML
的 return 值是合理的 HTML。它将修复输入中的任何严重错误,并将其转化为嵌套良好、转义良好且行为良好的内容。
(*) 如果你确实对它着迷,你可以使用 this blog post 的智慧来创建一个函数来替换出现的所有大写标签.innerHTML
的小写版本。这实际上是你可以使用正则表达式的东西("(</?[A-Z]+)"
,确切地说),因为我们知道不会有不属于标签的杂散<
字符串中的任何位置,因为这是 .innerHTML
的保证。虽然这将是一个很好的练习(它向您介绍了 VBScript 具有函数指针这一鲜为人知的事实),但我认为这并不值得。
我在这里苦苦挣扎,试图弄清楚如何替换特定单词后的所有双斜杠。
示例:
<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 解析器,但请放心,它仍然会比任何正则表达式做得更好。
有两个小问题:
我在测试中发现,出于某种原因,它坚持在
img.src
前面加上about:
或about:blank
。这不应该发生,但确实发生了。Replace()
调用的第二行删除了不需要的添加。.innerHTML
将生成大写的标签名称,因此<img>
在输出中变为<IMG>
。 HTML 源代码中无关紧要的换行符也可能会被删除。这是一个小烦恼,我建议你不要纠结它。(*)
但也有两大优势:
- DOM 使您能够以结构化的方式处理输入。您现在可以添加任意数量的复杂修复程序,而这些修复程序使用正则表达式是不可能做到的。
.innerHTML
的 return 值是合理的 HTML。它将修复输入中的任何严重错误,并将其转化为嵌套良好、转义良好且行为良好的内容。
(*) 如果你确实对它着迷,你可以使用 this blog post 的智慧来创建一个函数来替换出现的所有大写标签.innerHTML
的小写版本。这实际上是你可以使用正则表达式的东西("(</?[A-Z]+)"
,确切地说),因为我们知道不会有不属于标签的杂散<
字符串中的任何位置,因为这是 .innerHTML
的保证。虽然这将是一个很好的练习(它向您介绍了 VBScript 具有函数指针这一鲜为人知的事实),但我认为这并不值得。