سؤال

أنا أكتب بعض PHP لتحويل BBCode إلى HTML.

أود تحويل هذا bbcode:

[quote]
Hello World
[/quote]

الى الآتى الى القادم الى الم:

<blockquote>Hello World</blockquote>

وظيفة Preg_Reply التي أستخدمها لأداء هذا هي:

preg_replace("/\[quote\](.+?)\[\/quote\]/s", "<blockquote>\\1</blockquote>", $bbCode);

هذا تقريبا يفعل كل ما أحتاجه إليه، لكن مشكلتي هي أنه يحمل من خلال n من قبل وبعد "Hello World"، وتنتج:

<blockquote>
Hello World
</blockquote>

أي أفكار كيف يمكنني إصلاح هذا؟ كل مساعدة في تقدير كبير.

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

المحلول

جرب هذا التعبير العادي:

/\[quote\]\s*(.+?)\s*\[\/quote\]/s

نصائح أخرى

تحتاج إلى الهروب من الخلفية داخل اقتباسات مزدوجة. بدلا من " ["، تحتاج إلى " [".

الاحتمال سيكون استخدام "e' Regex-modifier., للاتصال، على سبيل المثال، trim وظيفة على السلسلة.

نقلا عن تلك الصفحة من الدليل:

هيا (PREG_REPLACE_EVAL)
إذا تم تعيين هذا المعدل، preg_replace()هل يستبعد الاستبدال العادي ل ونقلت واحدة، ونقلت مزدوجة، والخطوط الخلفية (\) و NULLسيتم تهرب من الأحرف الخاطئة في الخلفية في الخضرة البديلة.

فقط preg_replace() يستخدم هذا المعدل؛ يتم تجاهلها من قبل وظائف PCRE الأخرى.


على سبيل المثال، هذا الرمز، يختلف قليلا فقط عن:

$bbCode = <<<STR
[quote]
Hello World
[/quote]
STR;

$output = preg_replace("/\[quote\](.+?)\[\/quote\]/es", "'<blockquote>' . trim('\\1') . '</blockquote>'", $bbCode);
var_dump($output);

سوف أعطيك:

string '<blockquote>Hello World</blockquote>' (length=36)

أي، trim يتم استدعاء الدالة ما تم مطابقته - لاحظ أنه سيقوم بإزالة جميع المساحات البيضاء في بداية ونهاية السلسلة الخاصة بك؛ ليس فقط الخطوط الجيونية، ولكن أيضا مسافات ومجموعات.

(على سبيل المثال، يمكنك إلقاء نظرة على المثال # 4 على صفحة يدوية من preg_replace)
(ربما تكون مبالغة بعض الشيء في هذه الحالة، يجب أن أضيف - ولكن من الجيد أن أعرف على أي حال)

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