سؤال

أرغب في العمل على مرشح BBCode لموقع PHP. (أنا أستخدم CakePhP ، سيكون مساعد BBCode) لدي بعض المتطلبات.

BBCODES يمكن أن تكون متداخلة. لذلك شيء من هذا القبيل صالح.

[block]  
    [block]  
    [/block]  
    [block]  
        [block]  
        [/block]  
    [/block]  
[/block]  

يمكن أن تحتوي BBCODES على 0 أو أكثر من المعلمات.

exemple:

[video: url="url", width="500", height="500"]Title[/video]

BBCODES قد يكون لها سلوكيات mutliple.

لنقول، [url]text[/url] سوف تتحول إلى [url:url="text"]text[/url]أو أن BBCode الفيديو سيكون قادرًا على الاختيار بين YouTube ، dailymotion ....

أعتقد أنه يغطي معظم احتياجاتي. لقد فعلت شيئًا مع Regex. لكن مشكلتي الأكبر كانت مطابقة المعلمات. في الواقع ، حصلت على BBCode المتداخلة للعمل و BBCode مع 0 معلمات. ولكن عندما أضفت مطابقة regex للمعلمات ، فإنها لا تتطابق مع BBCode المتداخلة بشكل صحيح.

"\[($tag)(=.*)\"\](.*)\[\/\1\]" // لم يكن كذلك.* لكن المطابقة غير الحكومية

ليس لديّ regex الكامل معي الآن ، لكن كان لدي شيء يبدو هكذا (أعلاه).

لذلك هل هناك طريقة لمطابقة BBCode بكفاءة مع Regex أو أي شيء آخر. الشيء الوحيد الذي يمكنني التفكير فيه هو استخدام نمط الزائر وتقسيم نصي مع كل علامات محتملة بهذه الطريقة ، يمكن أن يكون لدي المزيد من التحكم في تحليل النص الخاص بي ، وربما يمكنني التحقق من صحة المستند الخاص بي ، لذلك إذا كان نص الإدخال لا "T لديك رمز BBCDER صالح. يمكنني إخطار المستخدم بخطأ قبل حفظ أي شيء.

أود استخدام SABLECC لإنشاء محلل نصفي.http://sablecc.org/

أي فكرة أفضل؟ أو أي شيء يمكن أن يؤدي إلى محلل BBCode مرن فعال؟

شكرا لك وآسف على لغتي الإنجليزية السيئة ...

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

المحلول

هناك كلاهما PECL و كمثرى مكتبة تحليل BBCode. البرنامج صعب بما فيه الكفاية دون إعادة اختراع سنوات العمل بمفردك.

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

  1. قم بتشغيل الكود من خلال HTMLSpecialChars للهروب من أي كيانات تحتاج إلى الهروب

  2. تحويل جميع الشخصيات [و] إلى <و> على التوالي

  3. لا تنس حساب القولون في حالات مثل [tagname:

إذا تم تداخل رمز BBCODE بشكل صحيح ، فيجب أن يتم تعيينك جميعًا لتمرير هذه السلسلة إلى كائن تحليل XML (SimpleXML ، DomDocument ، إلخ)

نصائح أخرى

هناك العديد من المكتبات الموجودة لحلية BBCode ، قد يكون من الأسهل النظر في هؤلاء أكثر من محاولة لف الخاص بك:

إليك زوجين ، أنا متأكد من أن هناك المزيد إذا نظرت حولك:
PECL BBCode
الكمثرى html_bbcodeparser

كنت أبحث في محلات BBCode بنفسي. يستخدم معظمهم Regex و PHP4 ويقومون بإنتاج أخطاء على PHP 5.2+ أو لا تعمل على الإطلاق. لا يبدو أن PECL BBCODE و PEAR HTML_BBCODEPARSER يتم الحفاظ عليهما بعد الآن (أواخر عام 2012) ولا يتم تثبيته بسهولة على إعداد الاستضافة المشترك الذي يجب أن أعمل معه. stringparser_bbcode يعمل مع بعض التعديلات البسيطة لـ 5.2+ ، لكن طريقة إضافة علامات جديدة خرقاء ، وتم تحديثها آخر مرة في عام 2008.

دفن في الصفحة الرابعة من بحث Bing (كنت أشعر باليأس) وجدت JBBCode, ، والذي يبدو جديدًا ويتطلب PHP 5.3. LISENCE. لم أحاول بعد إنشاء علامات مخصصة ، ولكن حتى الآن هي الوحيدة التي جربتها والتي تعمل خارج الصندوق على حساب استضافة مشترك مع PHP 5.3.

الرد على: "أي فكرة أفضل؟" (وأنا أفترض أن هذه كانت دعوة ليس فقط لتحسين الاقتراحات الخاصة بـ BBCode)

نظرنا مؤخرًا في الذهاب إلى طريق BBCode وقررنا استخدامه htmlpurifier في حين أن. استند هذا القرار جزئيًا إلى مقارنات (منحازة على الأرجح) بين الطرق المختلفة المدرجة في مجموعة HTMLPurifier هنا ومناقشة BBCode (مرة أخرى ، بواسطة مجموعة HTMLPurifer) هنا

وبالنسبة للسجل ، أعتقد أن لغتك الإنجليزية كانت جيدة جدًا. أنا متأكد من أنه أفضل بكثير مما يمكنني فعله بلغتك الأم.

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

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