O próprio ASP não oferece suporte à inclusão dinâmica de arquivos. A inclusão dinâmica atual usa o FSO para mesclar os arquivos incluídos no arquivo principal e, em seguida, executá-lo. A seguir, o método de arquivo de inclusão comum na forma de <!--#include file="filename.asp" --> também é chamado de "referência tradicional", e o arquivo de inclusão dinâmico implementado por funções é chamado de "referência dinâmica ". Os programas comuns são os seguintes:
Função include(nome do arquivo)
Dim re,content,fso,f,aspStart,aspEnd
set fso=CreateObject("Scripting.FileSystemObject")
definir f=fso.OpenTextFile(servidor.mappath(nome do arquivo))
content=f.ReadAll
f.fechar
definir f = nada
set fso=nada
set re=new RegExp
re.pattern="^s*="
aspFim=1
aspStart=inStr(aspEnd,conteúdo,"<%")+2
faça enquanto aspStart>aspEnd+1
Response.write Mid(conteúdo,aspEnd,aspStart-aspEnd-2)
aspEnd=inStr(aspStart,content,"%>")+2
Execute(re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write "))
aspStart=inStr(aspEnd,conteúdo,"<%")+2
laço
Response.write Mid(conteúdo,aspEnd)
definir re = nada
da função End
: include("youinc.asp")
No entanto, esta função não funciona quando há arquivos incluídos nos arquivos incluídos. Com base na função acima, melhorei a seguinte função. No arquivo incluído, há também um arquivo de inclusão normal <!--#include file="filename.asp" --> que também pode ser executado normalmente.
Função includeconvert(oRegExp, strFilename, strBlock)
Dim incStart, incEnd, match, oMatches, str, código
'Extraia o nome do arquivo da parte incluída da mesma maneira que o código ASP e produza o restante como está
código = ""
incFim = 1
incStart = InStr(incEnd,strBlock,"<!--#include ") + 13 'Para encontrar uma string de destino <!--#include tem exatamente 13 caracteres, então +13
Do While incStart>incEnd+12 'A distância mínima entre duas referências é contínua--><--#, incStart tem 13 caracteres contados a partir de <!--#include, portanto deve ser pelo menos 13- a mais que o incEnd anterior 1 A condição obtida de >incEnd+12
str = Mid(strBlock,incEnd,incStart-incEnd-13)
str = Replace(str, """", """""") 'Substitui uma aspa dupla simples por duas aspas duplas
str = Substituir(str, VbCr, "")
str = Substituir(str, VbLf, "")
str = Substituir(str, VbCrLf, "")
código = código & VbCrLf & "Response.Write """ & str & """"
incEnd=InStr(incStart,strBlock,"-->")+3
oRegExp.pattern="(w+)=""([^""]+)""" 'Match file="filename.ext" ou virtual="virtualname.ext", captura as duas substrings de tipo e nome de arquivo
Definir oMatches = oRegExp.Execute(Mid(strBlock,incStart,incEnd-incStart-3))
Set match = oMatches(0) 'Quando for determinado que existe apenas um conjunto de capturas, para obter as substrings correspondentes deste conjunto, você pode fazer isso sem usar For Each match In oMatches... Next
code = code & include(Mid(strFilename, 1, InStrRev(strFilename, "/")) & match.SubMatches(1)) 'Mid(filename, 1, InStrRev(filename, "/")) está sendo referenciado Quando o o nome do subarquivo tem um caminho, extraia o caminho e adicione-o na frente do nome do arquivo tradicionalmente referenciado no subarquivo para encontrar o caminho correto para abrir o arquivo, porque o caminho do arquivo na referência dinâmica é relativo ao arquivo principal . Para corresponder à segunda substring, use SubMatches(1)
incStart = InStr(incEnd,strBlock,"<!--#include ")+13
Laço
str = Mid(strBlock,incEnd)
str = Replace(str, """", """""") 'Substitui uma aspa dupla simples por duas aspas duplas
str = Substituir(str, VbCr, "")
str = Substituir(str, VbLf, "")
str = Substituir(str, VbCrLf, "")
código = código & VbCrLf & "Response.Write """ & str & """"
includeconvert = código
Função final
Função include(nome do arquivo)
Dim re, conteúdo, fso, f, aspStart, aspEnd, código
Definir fso=CreateObject("scripting.FileSystemObject")
Definir f=fso.OpenTextFile(Server.MapPath(nome do arquivo))
content=f.ReadAll
f.fechar
Definir f = nada
Defina fso = nada
código = ""
aspFim=1
aspStart=InStr(aspEnd,content,"<%")+2
Definir re = novo RegExp
Faça enquanto aspStart>aspEnd+1
'A referência tradicional <!--#inclde deve estar fora do segmento de código ASP, então transfira-a primeiro.
código = código & includeconvert (re, nome do arquivo, Mid(content,aspEnd,aspStart-aspEnd-2))
aspEnd=InStr(aspStart,content,"%>")+2
re.pattern="^s*=" 'Esta substituição regular substituiu originalmente <% = str %> pelo padrão <%Response.Write str %>
code = code & VbCrLf & re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write ") 'Adicione retorno de carro e alimentação de linha antes do bloco ASP para evitar vários erros de Response.Write entre blocos de conexão na mesma linha
aspStart=InStr(aspEnd,content,"<%")+2
Laço
código = código & includeconvert (re, nome do arquivo, Mid(content,aspEnd))
Definir re = nada
incluir = código
Função End
Por conveniência, a função acima retorna todo o código ASP que integra o arquivo incluído. Ao usá-la, você precisa usar Execute para executá-la, ou seja, ao usá-la, você precisa: Execute(include("file. asp")).
A função acima passa no teste quando o caminho do arquivo incluído e do arquivo principal é o mesmo. O tempo dos amigos interessados é limitado. bem-vindo para fornecer comentários e melhorias.