PHP explodiert Zeichenfolge nur, wenn Linie mit nicht zu Ende ‚!‘
Frage
Ich schreibe einen Parser für eine Scripting-Programmiersprache in PHP. Die Syntax dieser Skriptsprache wie folgt aussieht:
ZOMFG
&This is a comment
(show "Hello, World\!");
Dies ist eine Seite in dieser Sprache geschrieben, die anzeigt Hallo, Welt! im Browser. Aber ich konnte auch den Code wie folgt aussehen:
ZOMFG
&This is a comment !
on multiple !
lines.
(show !
"Hello, !
World\!!
");
Für jetzt verwende ich explode("\n", $content)
Inhalt der Seite zu einem Array zu explodieren, das jede Codezeile in einem separaten Index hat.
So
ZOMFG
&This is a comment
(show "Hello, World\!");
wird:
array('ZOMFG', '&This is a comment', '(show "Hello, World\!");');
Wenn eine Zeile endet mit einem! (Außer wenn das! Wird entkommen als \!), Es sollte diese Zeile hinzufügen, einschließlich der folgenden Zeile auf das Array als ein einziges Element. So
&This is a comment !
on multiple !
lines.
wird
&This is a comment on multiple lines.
Wer weiß, wie dies zu tun?
Lösung
Sie sollten mit einem negativen Lookbehind verwenden preg_split können.
(ich finde ein Beispiel)
$lines = preg_split('|(?<!\!)\n|', $code);
Wie pro Kommentar, beachten Sie, dass dies bewirkt, dass sowohl die Zeilenumbrüche und das! bleiben. Kann nicht eine einfachere Lösung dieses Problems als str_replace im Moment sehen - aber vorstellen, dass es eine ist ...