2009-08-03 6 views
1

J'écris un analyseur pour un langage de programmation de script en PHP. La syntaxe de ce langage de script ressemble à ceci:PHP n'explose une chaîne que si la ligne ne se termine pas par '!'

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

Ceci est une page écrite dans cette langue, qui affiche Bonjour, monde! dans le navigateur. Mais je pourrais aussi avoir le code comme ceci:

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

Pour l'instant j'utilise explode("\n", $content) exploser le contenu de la page à un tableau qui a chaque ligne de code dans un index séparé. Alors

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

devient:

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

Lorsqu'une ligne se termine par un! (sauf quand le! est échappé comme \!), il doit ajouter cette ligne, y compris la ligne suivante au tableau en tant qu'élément unique. Alors

&This is a comment ! 
on multiple ! 
lines. 

devient

&This is a comment on multiple lines. 

Est-ce que quelqu'un sait comment faire cela?

Répondre

2

vous devriez pouvoir utiliser preg_split avec un lookbehind négatif.

(je trouve un exemple)

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

Selon les commentaires, conscients du fait que cela provoque à la fois les personnages et le retour à la ligne! rester. Je ne vois pas de solution plus simple que str_replace en ce moment - mais imaginez qu'il y en ait une ...!

+0

bonne idée, mais cela n'aurait pas pour effet de supprimer la combinaison! \ N des lignes jointes. –

+0

Merci l'homme qui a travaillé. Un problème: le! reste au milieu de la ligne. Est-ce que quelqu'un sait comment résoudre ce problème? –

+1

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