لا يدعم ASP نفسه التضمين الديناميكي للملفات. يستخدم التضمين الديناميكي الحالي FSO لدمج الملفات المضمنة في الملف الرئيسي ثم تشغيله. فيما يلي، يُطلق على طريقة ملف التضمين العادية في شكل <!--#include file="filename.asp" --> أيضًا اسم "المرجع التقليدي"، ويسمى ملف التضمين الديناميكي الذي يتم تنفيذه بواسطة الوظائف "مرجع ديناميكي" ". البرامج الشائعة هي كما يلي:
الوظيفة تشمل (اسم الملف)
Dim re,content,fso,f,aspStart,aspEnd
set fso=CreateObject("Scripting.FileSystemObject")
تعيين f=fso.OpenTextFile(server.mappath(filename))
content=f.ReadAll
f. إغلاق
تعيين و = لا شيء
set fso=لا شيء
set re=new RegExp
إعادة النمط = "^s*="
aspEnd=1
aspStart=inStr(aspEnd,content,"<%")+2
افعل ذلك أثناء aspStart>aspEnd+1
الاستجابة.كتابة منتصف (المحتوى، aspEnd، aspStart-aspEnd-2)
aspEnd=inStr(aspStart,content,"%>")+2
تنفيذ(re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write"))
aspStart=inStr(aspEnd,content,"<%")+2
حلقة
الاستجابة.كتابة منتصف (المحتوى، aspEnd)
تعيين إعادة = لا شيء
وظيفة النهاية
: include("youinc.asp")
ومع ذلك، لا تعمل هذه الوظيفة عند وجود ملفات مضمنة في الملفات المضمنة. بناءً على الوظيفة المذكورة أعلاه، قمت بتحسين الوظيفة التالية في الملف المضمن، يوجد أيضًا ملف تضمين عادي <!--#include file="filename.asp" --> والذي يمكن أيضًا تشغيله بشكل طبيعي.
تتضمن الوظيفة تحويل (oRegExp، strFilename، strBlock)
Dim incStart, incEnd, match, oMatches, str, code
'استخرج اسم الملف الخاص بجزء التضمين بنفس طريقة كود ASP، وأخرج الباقي كما هو
الكود = ""
إند = 1
incStart = InStr(incEnd,strBlock,"<!--#include ") + 13 'للعثور على سلسلة مستهدفة <!--#include هي 13 حرفًا بالضبط، لذا +13
افعل بينما incStart>incEnd+12 'الحد الأدنى للمسافة بين مرجعين مستمر--><--#، incStart هو 13 حرفًا يتم العد من <!--#include، لذلك يجب أن يكون على الأقل 13- أكثر من incEnd السابق 1 الحالة التي تم الحصول عليها لـ >incEnd+12
str = Mid(strBlock,incEnd,incStart-incEnd-13)
str = Replace(str, """", """""") 'استبدل علامة الاقتباس المزدوجة بعلامتي اقتباس مزدوجتين
str = استبدال (str، VbCr، "")
str = استبدال(str، VbLf، "")
str = استبدال(str، VbCrLf، "")
كود = كود & VbCrLf & "Response.Write """ & str & """"
incEnd=InStr(incStart,strBlock,"-->")+3
oRegExp.pattern = "(w+) = ""([^""]+)"" "مطابقة الملف = "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 = Replace(str, """", """""") 'استبدل علامة الاقتباس المزدوجة بعلامتي اقتباس مزدوجتين
str = استبدال (str، VbCr، "")
str = استبدال(str، VbLf، "")
str = استبدال(str، VbCrLf، "")
كود = كود & VbCrLf & "Response.Write """ & str & """"
includeconvert = code
وظيفة النهاية
تشمل الوظيفة (اسم الملف)
Dim re، content، fso، f، aspStart، aspEnd، code
تعيين fso=CreateObject("scripting.FileSystemObject")
اضبط f=fso.OpenTextFile(Server.MapPath(filename))
content=f.ReadAll
f. إغلاق
تعيين و = لا شيء
تعيين fso=لا شيء
رمز = ""
aspEnd=1
aspStart=InStr(aspEnd,content,"<%")+2
تعيين إعادة = RegExp الجديد
افعل ذلك أثناء aspStart>aspEnd+1
'يجب أن يكون المرجع التقليدي <!--#inclde خارج مقطع كود ASP، لذا قم بنقله أولاً.
كود = كود & includeconvert (إعادة، اسم الملف، منتصف (المحتوى، 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 ") 'أضف سطر الإرجاع وتغذية السطر قبل كتلة ASP لتجنب أخطاء الاستجابة المتعددة. الكتابة بين كتل الاتصال على نفس الخط
aspStart=InStr(aspEnd,content,"<%")+2
حلقة
كود = كود & includeconvert (إعادة، اسم الملف، منتصف (المحتوى، aspEnd))
تعيين إعادة = لا شيء
تضمين = كود
وظيفة النهاية
للراحة، تقوم الوظيفة المذكورة أعلاه في النهاية بإرجاع رمز ASP بالكامل الذي يدمج الملف المضمن. عند استخدامه، تحتاج إلى استخدام التنفيذ لتنفيذه، أي عند استخدامه، تحتاج إلى: Execute(include("file. أسب")).
تجتاز الوظيفة المذكورة أعلاه الاختبار عندما يكون مسار الملف المضمن والملف الرئيسي متماثلين، ولا تقوم بمزيد من التسامح مع الخطأ عندما يكون مسار الملف المضمن والملف الرئيسي مختلفين، ويكون الوقت محدودًا مرحبا بكم في تقديم التعليقات والتحسينات.