PHP تنفجر سلسلة فقط إذا لم تنته تمشيا مع '!
سؤال
وأنا أكتب محلل للغة البرمجة النصية في PHP. بناء الجملة من أن لغة البرمجة يبدو مثل هذا:
ZOMFG
&This is a comment
(show "Hello, World\!");
وهذه هي صفحة مكتوبة بهذه اللغة، التي تعرض مرحبا، العالم! في المتصفح. ولكن يمكن أن يكون أيضا رمز مثل هذا:
ZOMFG
&This is a comment !
on multiple !
lines.
(show !
"Hello, !
World\!!
");
لأنا الآن استخدام explode("\n", $content)
تنفجر محتوى الصفحة إلى مجموعة التي لديها كل سطر من التعليمات البرمجية في مؤشر منفصل.
لذلك
ZOMFG
&This is a comment
(show "Hello, World\!");
ويصبح:
array('ZOMFG', '&This is a comment', '(show "Hello, World\!");');
وعندما ينتهي خط مع! (باستثناء عندما! وهرب ك \!)، وينبغي أن إضافة هذا الخط، بما في ذلك السطر التالي إلى مجموعة كعنصر واحد. لذلك
&This is a comment !
on multiple !
lines.
ويصبح
&This is a comment on multiple lines.
لا أحد يعرف كيفية القيام بذلك؟
المحلول
ويجب أن تكون قادرا على استخدام preg_split مع lookbehind السلبي.
و(أنا العثور على سبيل المثال)
$lines = preg_split('|(?<!\!)\n|', $code);
وكما في التعليقات، ندرك أن هذا يسبب كلا من أحرف السطر و! للتذكير. لا نستطيع أن نرى حلا أسهل لهذا من str_replace في هذه اللحظة - ولكن تخيل هناك واحد ...