PHP esplode la stringa solo se la riga non termina con '!'
Domanda
Sto scrivendo un parser per un linguaggio di programmazione di scripting in PHP. La sintassi di quel linguaggio di scripting è simile al seguente:
ZOMFG
&This is a comment
(show "Hello, World\!");
Questa è una pagina scritta in quella lingua, che mostra Hello, World! nel browser. Ma potrei anche avere un codice come questo:
ZOMFG
&This is a comment !
on multiple !
lines.
(show !
"Hello, !
World\!!
");
Per ora uso explode (" \ n " ;, $ content)
per far esplodere il contenuto della pagina in un array che ha ciascuna riga di codice in un indice separato.
Quindi
array('ZOMFG', '&This is a comment', '(show "Hello, World\!");');
diventa:
&This is a comment !
on multiple !
lines.
Quando una riga termina con un! (eccetto quando! è sfuggito come \!), dovrebbe aggiungere quella linea, inclusa la seguente riga all'array come un singolo elemento. Quindi
&This is a comment on multiple lines.
diventa ??p> <*>
Qualcuno sa come farlo?
Soluzione
dovresti essere in grado di usare preg_split con un aspetto negativo.
(sto cercando un esempio)
$lines = preg_split('|(?<!\!)\n|', $code);
Come da commenti, consapevole che ciò causa sia i caratteri di nuova riga che i! rimanere. Al momento non riesco a vedere una soluzione più semplice di str_replace - ma immagina che ce ne sia una ...!