إزالة أول نيولين preg_replace
-
13-09-2019 - |
سؤال
أنا أكتب بعض 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
)
(ربما تكون مبالغة بعض الشيء في هذه الحالة، يجب أن أضيف - ولكن من الجيد أن أعرف على أي حال)