2010-02-14 8 views
0

Je crée un projet, et je dois être en mesure d'utiliser une expression régulière (ou si quelque chose d'autre est préférable?)Regex pour le balisage correspondant dans le balisage PHPish?

Fondamentalement, je dois convertir une page de code de balisage PHPish pour que le « non-code » est converti en "code". Par exemple:

Orginal:

<?code 
    echo 'some text'; 
?> 
<head> 
</head> 
<body> 
</body> 
<?code 
    echo '</html>'; 
?> 

Converti:

<?code 
    echo '<html>'; 
    echo ' 
<head> 
</head> 
<body> 
</body>'; 
    echo '</html>'; 
?> 

Comment ce travail pourrait, tout en prenant en compte les citations? (Comme <?code $var='<?code stuff ?>';?>

De plus, si quelqu'un m'a donné quelque chose pour détecter les fichiers inclus, (à remplacer par quelque chose que les premiers « prepossesses » le fichier comprend alors il) (où includes sont similaires à PHP)

Est ceci même possible avec Regex? Je sais que vous ne voulez pas essayer d'analyser HTML avec regex, mais ce n'est pas essayer de l'analyser, c'est vraiment assez bête à la façon dont le balisage et tout est ..

Le projet sera effectivement implémenté dans Ruby (le préprocesseur), donc s'il y a quelque chose que Ruby a dans ce cas, alors il y a

Je sais que le code ressemble beaucoup à PHP, mais c'est parce qu'il l'est, mais il ne sera pas implémenté en PHP et le "code" utilisé ne sera pas PHP, mais utilisera un mécanisme de type <? code dans le balisage. Editer: Notez également que le langage à l'intérieur du balisage peut, à toutes fins pratiques, être Ruby. Donc, il peut contenir des citations et des commentaires qui ont la balise de code de fermeture.

+0

Non, regex n'est pas en mesure de faire un tel remplacement. –

+0

Comment voulez-vous écrire un analyseur assez rapide pour le faire alors? sûrement regex peut aider? – Earlz

+0

Le balisage en écho me semble suspect. à la fin, c'est ce que ' 'sont pour. Es-tu sûr de l'avoir besoin? avez-vous pensé à la mise en mémoire tampon de sortie? –

Répondre

3

Vous pouvez utiliser token_get_all pour obtenir un flux de jetons d'analyseur. Parcourez-les et faites-en l'écho lorsque vous rencontrez un T_INLINE_HTML, vous pouvez alors le réécrire en une déclaration d'écho. Éditer - Vous avez vu que vous utilisez Ruby. Évidemment, vous ne pouvez pas utiliser le tokeniser de PHP depuis Ruby. Peut-être que vous pouvez appeler php sur la ligne de commande?

Edit 2:

Est-ce même possible avec Regex? Je sais que votre suppose de ne pas essayer d'analyser HTML avec regex, mais ne cherche pas à analyser, il est vraiment être tout à fait muet sur la façon dont le balisage et tout est ..

Il est bien l'analyse syntaxique. Vous pouvez utiliser regexp pour diviser votre entrée en jetons (aka tokenization). Puisque la plupart des langages sont contextuels, vous devrez ensuite envoyer les jetons à une machine d'état, qui peut analyser le code en une représentation interne (un AST). Cela peut ensuite être transformé dans votre sortie cible.Cela semble compliqué et effrayant, mais c'est vraiment très simple quand vous l'avez essayé plusieurs fois. Je suggère que vous y travailliez, avec l'aide de Wikipedia et de Google.

+0

Nah , ce n'est pas ce que je vais faire (et le code actuel dans le balisage ne sera pas PHP) .. Désolé, changé ma question pour mieux refléter mes intentions – Earlz

+0

Eh bien, pas ce que je voulais ... mais devinez c'est le réponse :((laissez le qu l'option s'ouvre un peu plus longtemps au cas où) – Earlz

+0

Gardez à l'esprit que vous n'avez pas besoin d'écrire un analyseur qui reconnaisse la langue entière. Il suffit de symboliser les parties qui ont un contexte pertinent par rapport à ce que vous cherchez à manipuler. Par exemple. Fractionner par les séparateurs de commentaires, les séparateurs littéraux de chaînes, les barres obliques inverses et les marqueurs réels que vous recherchez. Cela fait pour une machine d'état assez simple. – troelskn

0

Plus quelques idées plutôt qu'une réponse:

Je vous suggère d'essayer de trouver une regex qui peut trouver les blocs de PHP puis envelopper tout le reste dans votre écho du lieu de l'inverse.

Une autre option peut être de regarder le tokenizer PHP, mais je ne suis pas sûr de savoir comment il traite des sections de HTML en dehors des tags, je crains.

+0

: '';/* aussi aucune balise de fermeture?> * /?>' –

+0

Hmm .. bon point .. Je suppose que ça va juste devoir être un analyseur hybride .. Remplacer tout le balisage de façon appropriée et tout analyser dans ' Earlz

+0

Juste le point, peut-être que le jeton pourrait être utile de regarder dans ce jeu. –

Questions connexes