سؤال

خلفية

لقد كتبت محلل bbcode بسيط جدا باستخدام C# الذي يحول BBCode إلى HTML. حاليا يدعم فقط [b], [i] و [u] العلامات. أعلم أن BBCode يعتبر دائما صريحا بغض النظر عن أي مستخدم كتبه. لا يمكنني العثور على مواصفات صارمة كيفية تحويل BBCode إلى HTML

سؤال

  1. هل المواصفات القياسية "BBCode to HTML" المواصفات موجودة؟
  2. كيف يجب علي التعامل "[b][b][/b][/b]"ب الآن غلة المحللين "<b>[b][/b]</b>".
  3. كيف يجب علي التعامل "[b][i][u]zzz[/b][/i][/u]" إدخال؟ حاليا محلل بلدي ذكي بما فيه الكفاية لإنتاج "<b><i><u>zzz</u></i></b>" الإخراج لمثل هذه الحالة، لكنني أتساءل أنه نهج "ذكي"، أم لا؟

المزيد من التفاصيل

لقد وجدت بعض تطبيقات محلل BBCODE جاهزة للاستعمال، لكنها ثقيلة للغاية / معقدة بالنسبة لي، وما هو أسوأ، واستخدام الكثير من التعبيرات العادية وإنتاج عدم العلامات التي أتوقعها. من الناحية المثالية، أريد تلقي XHTML عند الإخراج. لقواعد تحويل "BBCode إلى HTML"، فأنا أستخدم هذا المحلل المحلل عبر الإنترنت: http://www.bbcode.org/playground.php.. وبعد إنها تنتج HTML صحيحة بشكل حدسي على رأيي. الشيء الوحيد الذي أكرهه لا ينتج XHTML. علي سبيل المثال "[b][i]zzz[/b][/i]" يتحول إلى "<b><i>zzz</b></i>" (ملاحظة إغلاق ترتيب العلامات). Firebug بالطبع يظهر هذا "<b><i>zzz</i></b><i></i>". وبعد كما أفهم، تصنع المتصفحات هذه حالات أمر الإغلاق الخاطئ، لكنني موضع شك:

  1. يجب أن أعتمد على ميزة هذه المتصفحات وعدم محاولة جعل XHTML.
  2. يمكن "[b][i]zzz[/b]ccc[/i]" يجب أن يكون مفهوما "<b>[i]zzz</b>ccc[/i]" - يبدو منطقيا لتنسيق هذا التنسيق غير السليم، ولكن في صراع مع منتديات شعبية مخرجات BBCode (* zzz **** CCC *، وليس ** [i] zzzccc [/ i)

شكرا.

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

المحلول

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

فيما يتعلق بسؤالك الثاني، نظرا لأنك تحاول تحويل BBCode الصحيح إلى تصحيح HTML، إذا كانت المدخلات الخاصة بك [b][i]zzz[/b]ccc[/i], ، إنه صيح HTML يعادل سيكون <i><b>zzz</b>ccc</i> و لا <b>[i]zzz</b>ccc[/i]. وبعد وهذا هو المكان الذي تحصل فيه الأمور معقدة لأنك لن تكتب فقط محول بعد الآن، ولكن أيضا مدقق بناء الجملة / تصحيح التشغيل. لقد كتبت برنامج نصي مشابه في PHP لغرب البرمجة النصية لعبة غريبة إلى حد ما ولكن يمكن تطبيق المنطق بسهولة على قضيتك. في الأساس، كان لدي مجموعة علامة لكل علامة افتتاح وفحصها إذا كانت علامة الإغلاق في الموضع الصحيح. بالطبع، هذا يعطي وظائف محدودة ولكن لما احتاجته فعلت الخدعة. إذا كنت بحاجة إلى أنماط بحث أكثر تقدما، أعتقد أنك عالق مع Regex.

نصائح أخرى

إذا كنت ستفرق فقط B، I و U، ما هي العلامات المهمة بشكل رهيب، فلماذا لا يكون لديك ببساطة عداد لكل من تلك العلامات: +1 في كل مرة يتم فيها فتحها، و -1 في كل مرة يتم إغلاقها.

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

فيما يتعلق بالعلامة المقدمة من المستخدم غير الصالحة، لديك ثلاثة خيارات على الأقل:

  1. تجريده
  2. اطبع حرفيا، أي لا تحويله إلى HTML
  3. محاولة لإصلاحها.

أنا لا أوصي 3. يصبح صعبا حقا بسرعة كبيرة. 1 و 2 كلاهما خيارات معقولة.

أما بالنسبة لكيفية تحليل BBCode، أوصي بشدة باستخدام Regex. BBCode هي في الواقع لغة معقدة إلى حد ما. والأهم من ذلك، فإنه يدعم التعشيش من العلامات. Regex لا يمكن التعامل مع التعشيش التعسفي. هذه واحدة من القيود الأساسية لريكس. هذا يجعلها اختيارا سيئا لغات تحليل مثل HTML و BBCode.

لمشروعي الخاص، rbbcode., ، أنا استخدم تحليل التعبير غرامة (ربط). أوصي باستخدام شيء مماثل. بشكل عام، تسمى هذه الأنواع من الأدوات "محامرة مترجم"، "مولدات مترجم،" أو "مولدات المحلل المحللين". ربما يكون استخدام أحد هذه الأسئلة Sanest Sanest، حيث يسمح لك بتحديد قواعد اللغة في BBCode بتنسيق نظيف وقابل للقراءة. سيكون لديك عدد أقل من الأخطاء بهذه الطريقة مما لو كنت تستخدم Regex أو محاولة لبناء آلة الحالة الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top