فب-القوالب مع العلامات المخصصة-هل هذا استخدام شرعي من التقييم?

StackOverflow https://stackoverflow.com/questions/3326446

  •  29-09-2020
  •  | 
  •  

سؤال

لمحة عامة

في نهاية عام 2009 ، كتبت نظام قوالب بسيط ل فب/هتمل لاستخدامها في المنزل من قبل المصممين لدينا لمواقع نوع الكتيب وير.والهدف من هذا النظام هو السماح القوالب في هتمل نقية خلاف ذلك عن طريق العلامات المخصصة التي تتم معالجتها من قبل فب.على سبيل المثال ، قد تبدو الصفحة النمطية كما يلي:

<tt:Page template="templates/main.html">
  <tt:Content name="leftColumn">
    <p> blah blah </p>
    ...
  </tt:Content>
  <tt:Content name="rightColumn">
    <p> blah blah </p>
    ...
  </tt:Content>
</tt:Page>

القالب نفسه قد تبدو شيئا من هذا القبيل:

<html>
  <head>...</head>
  <body>
    <div style="float:left; width:45%">
      <tt:Container name="leftColumn" />
    </div>
    <div style="width:45%">
      <tt:Container name="rightColumn" />
    </div>
  </body>
</html>

إلى جانب علامات الصفحة والمحتوى/الحاوية ، هناك عدد قليل من العلامات الأخرى المضمنة في جوهر أشياء مثل التحكم في التدفق ، والتكرار على مجموعة ، وإخراج القيم الديناميكية ، وما إلى ذلك.تم تصميم الإطار بحيث يكون من السهل جدا إضافة مجموعة العلامات الخاصة بك المسجلة تحت بادئة ومساحة اسم أخرى.

علامات مخصصة ل فب

كيف يمكننا تحليل هذه العلامات المخصصة?منذ كنت لا يضمن أن ملف هتمل هو شمل شكلت بشكل جيد ، حلول مثل زسلت/زباث لن تكون موثوقة.بدلا من ذلك ، نستخدم التعبير العادي للبحث عن العلامات مع البادئات المسجلة ، واستبدال تلك مع رمز فب.رمز فب هو تصميم يستند إلى كومة...عند مواجهة علامة فتح ، يتم إنشاء كائن يمثل العلامة على المكدس ، ويتم تشغيل" وظيفة التهيئة " (إن وجدت).كلما تمت مصادفة علامة إغلاق مسجلة ، يتم إخراج الكائن الأحدث من المكدس ، ويتم تشغيل "وظيفة العرض" الخاصة به.

لذلك ، بعد أن يحل الإطار محل علامات القوالب مع فب ، قد تبدو صفحة مثالنا شيئا من هذا القبيل (في العقارات انها أقبح قليلا):

<?php $tags->push('tt', 'Page', array('template'=>'templates/main.html')); ?>
  <?php $tags->push('tt', 'Content', array('name'=>'leftColumn')); ?>
    <p> blah blah </p>
    ...
  <?php $tags->pop(); ?>
  <?php $tags->push('tt', 'Content', array('name'=>'rightColumn')); ?>
    <p> blah blah </p>
    ...
  <?php $tags->pop(); ?>
<?php $tags->pop(); ?>

الخير ، السيء ، و eval

الآن, كيفية تنفيذ لدينا رمز فب ولدت حديثا?يمكنني التفكير في بعض الخيارات هنا.الأسهل هو ببساطة eval السلسلة ، والتي تعمل بشكل جيد بما فيه الكفاية.ومع ذلك ، فإن أي مبرمج اقول لكم "التقييم هو الشر ، لا تستخدم ذلك..."لذا فإن السؤال هو ، هل هناك أي شيء أكثر ملاءمة من eval التي يمكننا استخدامها هنا?

لقد فكرت في استخدام ملف مؤقت أو مخبأ ، باستخدام php:// تيارات الإخراج ، وما إلى ذلك ، ولكن بقدر ما أستطيع أن أرى هذه لا تقدم أي ميزة حقيقية على eval.يمكن أن يؤدي التخزين المؤقت إلى تسريع الأمور ، ولكن من الناحية العملية ، فإن جميع المواقع التي لدينا على هذا الشيء سريعة بالفعل ، لذلك لا أرى حاجة لإجراء تحسينات في السرعة في هذه المرحلة.

أسئلة

لكل من الأشياء في هذه القائمة:هل هي فكرة جيدة?هل يمكنك التفكير في بديل أفضل?

  • الفكرة كلها بشكل عام (علامات مخصصة ل هتمل / فب)
  • تحويل العلامات إلى رمز فب بدلا من المعالجة مباشرة
  • النهج القائم على المكدس
  • استخدام eval (أو ما شابه)

شكرا للقراءة وتيا على أي نصيحة.:)

هل كانت مفيدة؟

المحلول

واسمحوا لي أن أؤيد نهجا مختلفا.بدلا من توليد رمز فب حيوي ومن ثم محاولة لمعرفة كيفية تنفيذه بأمان ، تنفيذه مباشرة كما واجهت العلامات.يمكنك معالجة كتلة كاملة من هتمل في مسار واحد والتعامل مع كل علامة كما واجهتها على الفور.

اكتب حلقة تبحث عن العلامات.سوف هيكلها الأساسي تبدو مثل هذا:

  1. ابحث عن علامة مخصصة ، والتي تجدها في الموضع n.
  2. كل شيء قبل الموقف n يجب أن تكون هتمل بسيطة ، لذلك إما حفظه للمعالجة أو الإخراج على الفور (إذا كان لديك أي علامات على الخاص بك $tags كومة ربما لا تحتاج إلى حفظه في أي مكان).
  3. تنفيذ التعليمات البرمجية المناسبة للعلامة.بدلا من توليد التعليمات البرمجية التي تدعو $tags->push, ، فقط اتصل $tags->push مباشرة.
  4. ارجع إلى الخطوة 1.

مع هذا النهج يمكنك فقط استدعاء وظائف فب مباشرة ، أنت أبدا بناء رمز فب على الطاير ومن ثم تنفيذه في وقت لاحق.الحاجة إلى eval ذهب.

سيكون لديك أساسا حالتين للخطوة # 3.عندما تصادف علامة فتح سوف تفعل على الفور push.ثم في وقت لاحق عندما تضغط على علامة الإغلاق يمكنك القيام به pop ثم تعامل مع العلامة بالطريقة المناسبة ، الآن بعد أن عالجت محتويات العنصر المخصص بالكامل.

بل هو أيضا أكثر كفاءة لمعالجة هتمل بهذه الطريقة.القيام بحث متعددة ويستبدل على سلسلة هتمل طويلة غير فعالة كما كل بحث وكل استبدال هو س(n) على طول السلسلة.بمعنى أنك تقوم بمسح السلسلة مرارا وتكرارا ، وفي كل مرة تقوم فيها باستبدال ، يجب عليك إنشاء سلاسل جديدة كاملة ذات طول مماثل.إذا كان لديك 20 كيلو بايت من هتمل ثم كل استبدال ينطوي على البحث من خلال أن 20 كيلو بايت ثم إنشاء سلسلة 20 كيلو بايت جديدة بعد ذلك.

نصائح أخرى

لقد نشرت إجابة أخرى لأنها تختلف اختلافا جذريا عن الأولى ، والتي قد تكون ذات قيمة أيضا.

أساسا ، هذا السؤال يسأل كيفية تنفيذ رمز فب مع التعبير العادي.قد لا يبدو ذلك واضحا ، لكن هذا ما ينوي التقييم تحقيقه.

مع ذلك ، بدلا من القيام بتمريرة من بريغريبلاس ومن ثم القيام تقييم ، هل يمكن أن مجرد استخدام وظيفة فب بريغريبلاسيل_كالباك لتنفيذ قطعة من التعليمات البرمجية عند مطابقة.

انظر هنا لمعرفة كيفية عمل الوظيفة: http://us.php.net/manual/en/function.preg-replace-callback.php

نعم ، بدلا من التقييم ، يمكنك أن تفعل ما زند والأطر الرئيسية الأخرى القيام به ، واستخدام التخزين المؤقت الإخراج:

ob_start();
include($template_file); //has some HTML and output generating PHP
$result = ob_get_contents();
ob_end_clean();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top