2009-08-03 6 views
1

Ich schreibe einen Parser für eine Skriptsprache in PHP. Die Syntax dieser Skriptsprache sieht folgendermaßen aus:PHP explodiert String nur, wenn Zeile nicht mit '!' Endet

ZOMFG 
&This is a comment 
(show "Hello, World\!"); 

Dies ist eine Seite in dieser Sprache, die Hello, World! im Browser. Aber ich kann auch Code wie diese:

ZOMFG 
&This is a comment ! 
on multiple ! 
lines. 
(show ! 
"Hello, ! 
World\!! 
"); 

Vorerst ich explode("\n", $content) verwende der 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 mit einem Ende! (außer wenn das! als \! ​​maskiert ist), sollte diese Zeile einschließlich der folgenden Zeile als ein einzelnes Element zum Array hinzugefügt werden. So

&This is a comment ! 
on multiple ! 
lines. 

wird

&This is a comment on multiple lines. 

Wer weiß, wie dies zu tun?

Antwort

2

sollten Sie preg_split mit einem negativen Lookbehind verwenden können.

(ich finde ein Beispiel)

$lines = preg_split('|(?<!\!)\n|', $code); 

Per Kommentare, beachten Sie, dass dies bewirkt, dass sowohl die Zeilenumbrüche und das! bleiben. Ich kann keine einfachere Lösung als str_replace im Moment sehen - aber stell dir vor, es gibt einen ...!

+0

nette Idee, aber das hätte nicht den Effekt, die! \ N Kombination aus den verbundenen Linien zu strippen. –

+0

Danke Mann, der funktioniert hat. Ein Problem: das! bleibt in der Mitte der Linie. Kann jemand das reparieren? –

+1

str_replace ('\!', "!", $ Line); –

Verwandte Themen