ASP เองไม่สนับสนุนการรวมไฟล์แบบไดนามิก ปัจจุบันการรวมแบบไดนามิกใช้ FSO เพื่อรวมไฟล์ที่รวมไว้ในไฟล์หลักแล้วรัน ต่อไปนี้ วิธีการรวมไฟล์แบบธรรมดาในรูปแบบของ <!--#include file="filename.asp" --> เรียกอีกอย่างว่า "การอ้างอิงแบบดั้งเดิม" และไฟล์รวมแบบไดนามิกที่นำมาใช้โดยฟังก์ชันเรียกว่า "การอ้างอิงแบบไดนามิก" ". โปรแกรมทั่วไปมีดังนี้:
ฟังก์ชั่นรวม(ชื่อไฟล์)
Dim re,content,fso,f,aspStart,aspEnd
set fso=CreateObject("Scripting.FileSystemObject")
ตั้งค่า f=fso.OpenTextFile (server.mappath (ชื่อไฟล์))
เนื้อหา=f.อ่านทั้งหมด
ฉ.ปิด
ตั้งค่า f=ไม่มีอะไร
set fso=nothing
set re=new RegExp
ใหม่.รูปแบบ="^s*="
aspEnd=1
aspStart=inStr(aspEnd,เนื้อหา,"<%")+2
ทำในขณะที่ aspStart>aspEnd+1
Response.write Mid (เนื้อหา, aspEnd, aspStart-aspEnd-2)
aspEnd=inStr(aspStart,เนื้อหา,"%>")+2
ดำเนินการ (re.replace (Mid (เนื้อหา, aspStart, aspEnd-aspStart-2), "Response.Write "))
aspStart=inStr(aspEnd,เนื้อหา,"<%")+2
วนซ้ำ
Response.write Mid (เนื้อหา, aspEnd)
ตั้งค่าใหม่ = ไม่มีอะไร
ฟังก์ชันสิ้นสุด
: include("youinc.asp")
อย่างไรก็ตาม ฟังก์ชันนี้จะไม่ทำงานเมื่อมีไฟล์รวมอยู่ในไฟล์ที่รวมไว้ จากฟังก์ชันข้างต้น ฉันได้ปรับปรุงฟังก์ชันต่อไปนี้ ในไฟล์ที่รวมไว้ ยังมีไฟล์รวมปกติ <!--#include file="filename.asp" --> ซึ่งสามารถทำงานได้ตามปกติ
ฟังก์ชั่นรวมการแปลง (oRegExp, strFilename, strBlock)
Dim incStart, incEnd, จับคู่, oMatches, str, รหัส
'แยกชื่อไฟล์ของส่วนที่รวมในลักษณะเดียวกับโค้ด ASP และส่งออกส่วนที่เหลือตามที่เป็นอยู่
รหัส = ""
IncEnd = 1
incStart = InStr(incEnd,strBlock,"<!--#include ") + 13 'หากต้องการค้นหาสตริงเป้าหมาย <!--#include จะต้องมีอักขระ 13 ตัว ดังนั้น +13
ทำในขณะที่ incStart>incEnd+12 'ระยะห่างขั้นต่ำระหว่างการอ้างอิงทั้งสองเป็นแบบต่อเนื่อง--><--#, incStart คือ 13 อักขระนับจาก <!--#include ดังนั้นจึงต้องมีอย่างน้อย 13- มากกว่า incEnd ก่อนหน้า 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 & """"
รวมการแปลง = รหัส
ฟังก์ชันสิ้นสุด
ฟังก์ชั่นรวม (ชื่อไฟล์)
ติ่มซำ, เนื้อหา, fso, f, aspStart, aspEnd, โค้ด
ตั้งค่า fso=CreateObject("scripting.FileSystemObject")
ตั้งค่า f=fso.OpenTextFile(Server.MapPath(ชื่อไฟล์))
เนื้อหา=f.อ่านทั้งหมด
ฉ.ปิด
ตั้งค่า f=ไม่มีอะไร
ตั้งรหัส fso=nothing
= ""
aspEnd=1
aspStart=InStr(aspEnd,เนื้อหา,"<%")+2
ตั้งค่าใหม่ = RegExp ใหม่
ทำในขณะที่ aspStart>aspEnd+1
'การอ้างอิงดั้งเดิม <!--#inclde ต้องอยู่นอกส่วนของโค้ด ASP ดังนั้นให้โอนก่อน
code = code & includeconvert (re, ชื่อไฟล์, Mid (เนื้อหา, aspEnd, aspStart-aspEnd-2))
aspEnd=InStr(aspStart,เนื้อหา,"%>")+2
re.pattern="^s*=" 'การแทนที่แบบปกตินี้เดิมทีแทนที่ <% = str %> ด้วยมาตรฐาน <%Response.Write str %>
code = code & VbCrLf & re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write ") 'เพิ่มการขึ้นบรรทัดใหม่และการป้อนบรรทัดก่อนบล็อก ASP เพื่อหลีกเลี่ยงข้อผิดพลาด Response.Write ระหว่างการเชื่อมต่อบล็อกหลายรายการ บนบรรทัดเดียวกัน
aspStart=InStr(aspEnd,เนื้อหา,"<%")+2
วนซ้ำ
code = code & includeconvert (re, ชื่อไฟล์, Mid (เนื้อหา, aspEnd))
ตั้งค่าใหม่ = ไม่มีอะไร
รวม = รหัส
ฟังก์ชัน
ด้านบนจะส่งคืนโค้ด ASP ทั้งหมดที่รวมไฟล์ที่รวมไว้ไว้ในท้ายที่สุด เมื่อใช้งาน คุณจะต้องใช้ Execute เพื่อดำเนินการ กล่าวคือ เมื่อใช้งานคุณจะต้อง: Execute(include("file. งูเห่า")).
ฟังก์ชั่นข้างต้นผ่านการทดสอบเมื่อเส้นทางของไฟล์ที่รวมอยู่และไฟล์หลักเหมือนกัน มันไม่ทำให้ความทนทานต่อข้อผิดพลาดเพิ่มเติมเมื่อเส้นทางของไฟล์ที่รวมอยู่และไฟล์หลักต่างกัน โดยมีเวลาจำกัด ยินดีให้ความเห็นและการปรับปรุง