使用VBscript搜索并动态填充选项

时间:2013-07-22 21:51:53

标签: search vbscript html-select hta

目标

要搜索文本文件中的一堆行,如果找到匹配项,则在HTA中显示的“选项”列表中填充该行。 例如:如果在总共10行中的5行中找到“设置”,则所有5行都需要填充为“选项”

代码

    Set objFSO = CreateObject("Scripting.Filesystemobject")
Set objRegEx = New RegExp
        With objRegEx

        .Pattern    = "(\b" & "setup" & "\b)"
        .IgnoreCase = True
        .Global     = True
        End With

Set objOpen = objFSO.OpenTextFile ("FileList.lst", 1)
Contents = objOpen.ReadAll


Set objMatchAll = objRegEx.Execute( Contents )
If objMatchAll.count > 0 Then

    Set objOpen = objFSO.OpenTextFile ("FileList.lst", 1)
        Do Until objOpen.AtEndOfStream
            Line = objOpen.ReadLine
            Set objMatchAny = objRegEx.Execute( Line )
                        If objMatchAny.count > 0 Then
                            Set objOption = Document.createElement("OPTION")
                            objOption.Text = Line
                            objOption.Value = Line
                            ValuesList.add objOption
                            'Matched = Matched & vbNewLine & Line
                            MatchCount = MatchCount + 1

                        End If
        Loop
Else                                

    MsgBox "No results"
End If

解释

代码在文件'FileList.lst'中查找术语'setup'(当然这是在执行时动态填充)。找到结果时,会生成一个“选项”对象,并将其添加到使用标记的HTML正文中的“ValuesList”列表中。

注1:我生成'Options'对象而不是仅加载该行的原因是我们可以填充标记。使用标签,以便我们可以选择任何一个搜索结果。

注2:创建'Contents'变量的原因是,如果根本没有匹配,则不需要去每一行找到匹配,这只需要更长的时间来显示该消息。

问题

代码工作正常,测试最多150个结果(结果),但是当有大量匹配时我的HTA会冻结。

问题

  1. 可以修改现有代码以更好地执行,比如创建“选项”对象的不同方法,生成“ValuesList”的替代方法吗?
  2. 有没有办法从'Contents'变量返回匹配的行?
  3. 而不是运行两个objRegEx搜索结果?

    更新

    好吧,我运行我的脚本没有objOption部分,它没有创建和添加选项到我的ValuesList,只有regexp解析通过58k行,也导致58k匹配,结果是3secs ...所以看起来我需要一个替代填充我的HTA选项列表...它无法处理那么多选项来选择......任何替代方案?我在浏览器中使用了相同的逻辑,整个浏览器都冻结了......

2 个答案:

答案 0 :(得分:2)

看起来你真的只关心正则表达式是否与特定行匹配。由于您不需要知道发生了多少匹配,也不需要实际匹配文本,因此您可以使用Test方法。这应该更快,因为它将在第一次匹配后停止,而且它不必构建Matches集合。出于几乎相同的原因,我还将Global属性保留为默认值False,但如果您只是使用Test方法,我认为不会Global财产很重要。

答案 1 :(得分:1)

感谢Cheran Shunmugavel我发现最​​好的方法是使用DocumentFragments。我在我的代码中实现了这个概念,结果很棒!

新代码

Set objFSO = CreateObject("Scripting.Filesystemobject")
Set objRegEx = New RegExp
        With objRegEx

        .Pattern    = "(\b" & "setup" & "\b)"
        .IgnoreCase = True
        .Global     = True
        End With

Set objFragment = Document.createDocumentFragment()
Set objOpen = objFSO.OpenTextFile ("FileList.lst", 1)
Contents = objOpen.ReadAll


Set objMatchAll = objRegEx.Execute( Contents )
If objMatchAll.count > 0 Then

    Set objOpen = objFSO.OpenTextFile ("FileList.lst", 1)
        Do Until objOpen.AtEndOfStream
            Line = objOpen.ReadLine
            Set objMatchAny = objRegEx.Execute( Line )
                        If objMatchAny.count > 0 Then
                            Set objOption = Document.createElement("OPTION")
                            objOption.innerHTML = Line
                objFragment.appendchild objOption
                            MatchCount = MatchCount + 1

                        End If
        Loop

    ViewList.appendChild objFragment.cloneNode(True)
Else                                

    MsgBox "No results"
End If

旧代码:53分钟23秒

新密码:31秒