ASP 자체는 파일의 동적 포함을 지원하지 않습니다. 현재 동적 포함은 FSO를 사용하여 포함된 파일을 기본 파일에 병합한 다음 실행합니다. 이하에서는 <!--#include file="filename.asp" --> 형식의 일반 포함 파일 메서드를 "전통적 참조"라고도 하며, 함수로 구현된 동적 포함 파일을 "동적 참조"라고 합니다. ". 일반적인 프로그램은 다음과 같습니다.
함수 include(파일명)
Dim re,content,fso,f,aspStart,aspEnd
set fso=CreateObject("Scripting.FileSystemObject")
f=fso.OpenTextFile(server.mappath(파일 이름))을 설정합니다.
콘텐츠=f.ReadAll
f.닫기
f=아무것도 설정하지 않음
fso=nothing 설정
re=new RegExp
설정
re.pattern="^s*="
aspEnd=1
aspStart=inStr(aspEnd,content,"<%")+2
aspStart>aspEnd+1 동안 수행
Response.write Mid(content,aspEnd,aspStart-aspEnd-2)
aspEnd=inStr(aspStart,content,"%>")+2
실행(re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write "))
aspStart=inStr(aspEnd,content,"<%")+2
고리
Response.write Mid(content,aspEnd)
다시=아무것도 설정하지 않음
End 함수
사용 예: include("youinc.asp")
단, 포함된 파일에 포함된 파일이 있는 경우에는 이 함수가 작동하지 않습니다. 위 함수를 바탕으로 다음 함수를 개선했습니다. 포함된 파일에는 정상적으로 실행될 수 있는 일반 include 파일 <!--#include file="filename.asp" -->도 있습니다.
함수 includeconvert(oRegExp, strFilename, strBlock)
Dim incStart, incEnd, match, oMatches, str, code
'ASP 코드와 동일하게 include 부분의 파일명을 추출하고 나머지는 그대로 출력한다.
코드 = ""
IncEnd = 1
incStart = InStr(incEnd,strBlock,"<!--#include ") + 13 '대상 문자열을 찾으려면 <!--#include는 정확히 13자이므로 +13
Do While incStart>incEnd+12 '두 참조 사이의 최소 거리는 연속적입니다--><--#, incStart는 <!--#include부터 계산하여 13자이므로 이전 incEnd보다 최소 13- 커야 합니다. 1 >incEnd+12의 획득 조건
str = 중간(strBlock,incEnd,incStart-incEnd-13)
str = 바꾸기(str, """", """""") '작은 큰따옴표를 두 개의 큰따옴표로 바꿉니다.
str = 바꾸기(str, VbCr, "")
str = 바꾸기(str, VbLf, "")
str = 바꾸기(str, VbCrLf, "")
코드 = 코드 & VbCrLf & "Response.Write """ & str & """"
incEnd=InStr(incStart,strBlock,"-->")+3
oRegExp.pattern="(w+)=""([^""]+)""" 'Match file="filename.ext" 또는 virtual="virtualname.ext", 유형 및 파일 이름의 두 하위 문자열 캡처
oMatches = oRegExp.Execute(Mid(strBlock,incStart,incEnd-incStart-3)) 설정
Set match = oMatches(0) '캡처 세트가 하나만 있다고 판단되면 이 세트의 일치하는 하위 문자열을 얻으려면 For Each match In oMatches를 사용하지 않고도 이 작업을 수행할 수 있습니다... 다음
code = code & include(Mid(strFilename, 1, InStrRev(strFilename, "/")) & match.SubMatches(1)) 'Mid(filename, 1, InStrRev(filename, "/"))가 참조되는 경우 하위 파일 이름에 경로가 있는 경우 경로를 추출하고 하위 파일에서 전통적으로 참조되는 파일 이름 앞에 추가하여 파일을 열 수 있는 올바른 경로를 찾으세요. 동적 참조의 파일 경로는 기본 파일에 상대적이기 때문입니다. . 두 번째 부분 문자열을 일치시키려면 SubMatches(1)을 사용하십시오.
incStart = InStr(incEnd,strBlock,"<!--#include ")+13
고리
str = 중간(strBlock,incEnd)
str = 바꾸기(str, """", """""") '작은 큰따옴표를 두 개의 큰따옴표로 바꿉니다.
str = 바꾸기(str, VbCr, "")
str = 바꾸기(str, VbLf, "")
str = 바꾸기(str, VbCrLf, "")
코드 = 코드 & VbCrLf & "Response.Write """ & str & """"
includeconvert = 코드
기능 종료
함수 include(파일명)
희미한 내용, 콘텐츠, fso, f, aspStart, aspEnd, 코드
fso=CreateObject("scripting.FileSystemObject")를 설정합니다.
f=fso.OpenTextFile(Server.MapPath(파일 이름))을 설정합니다.
콘텐츠=f.ReadAll
f.닫기
f=아무것도 설정하지 않음
fso=nothing
코드 설정 = ""
aspEnd=1
aspStart=InStr(aspEnd,content,"<%")+2
re=new RegExp 설정
aspStart>aspEnd+1 동안 수행
'기존 참조 <!--#inclde는 ASP 코드 세그먼트 외부에 있어야 하므로 먼저 전송하세요.
code = code & includeconvert (re, 파일 이름, Mid(content,aspEnd,aspStart-aspEnd-2))
aspEnd=InStr(aspStart,content,"%>")+2
re.pattern="^s*=" '이 정규 교체는 원래 <% = str %>를 표준 <%Response.Write str %>로 대체했습니다.
code = code & VbCrLf & re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write ") '연결 블록 사이의 여러 Response.Write 오류를 방지하려면 ASP 블록 앞에 캐리지 리턴 및 줄 바꿈을 추가하세요. 같은 줄에
aspStart=InStr(aspEnd,content,"<%")+2
고리
code = code & includeconvert (re, 파일 이름, Mid(content,aspEnd))
다시=없음으로 설정
포함 = 코드
End Function
편의상 위 함수는 궁극적으로 포함된 파일을 통합하는 전체 ASP 코드를 반환합니다. 사용 시 Execute를 사용하여 실행해야 합니다. 즉, 사용 시에는 Execute(include("file. asp")).
위 함수는 포함된 파일과 메인 파일의 경로가 동일할 때 테스트를 통과하며, 포함된 파일과 메인 파일의 경로가 다른 경우에는 추가 내결함성을 만들지 않습니다. 의견과 개선 사항을 제공해 주셔서 감사합니다.