Rechercher : dans
Par :

Petit parser PHP en shell

Dernière réponse le 21 sep 2009 à 14:15:02 Groarh, le 11 oct 2008 à 00:22:33 
 Signaler ce message aux modérateurs

Bonjour à tous,
je travaille très souvent sur des postes de mon campus universitaire, où sont installés les distribs
openSUSE 10.3 et Gentoo (je sais plus quelle version).
Web developer las de devoir passer par le ftp pour vérifier chaque modification de script php, je me suis demandé s'il n'y avait pas moyen de faire plus simple. En fouillant un peu, je constate que sous les deux systèmes, je dispose de PHP mais pas d'Apache, et je n'ai pas de droits d'admin pour installer quoi que ce soit.

J'ai alors tenté de me faire un petit parser maison, en traitant un fichier php par un shell assez léger, pour obtenir un fichier htm correspondant. Problème : je m'y connais assez peu en shell... L'idée de base c'est :

php -f fichier.php > fichier.htm

Ce que j'aimerais, c'est :
- d'une part, générer un .htm avec le même nom que le .php ;
- d'autre part, si c'est pas trop lourd à mettre en oeuvre, pouvoir lancer le parser en balançant le script dessus par glisser/déposer (simple question de confort, mais le but c'est aussi que j'apprenne en shell ^^)


Toute idée, je suis preneur, exprimez-vous ! ;)
Configuration: Windows XP
Firefox 3.0.3

Meilleures réponses pour « Petit parser PHP en shell » dans :
PHP - Parser du XML Voir Introduction à XML PHP permet l'analyse syntaxique (parsage ou parsing en anglais) d'un document XML. Le langage XML (eXtensible Markup Language, traduisez Langage à balises extensibles) est un métalangage, c'est-à-dire un langage permettant de...
PHP Parse error: unexpected '<' in ... eval()'d code on l VoirSymptômes Lors de l'utilisation de la fonction eval() en PHP, ce dernier se plaint et vous affiche un message de la forme suivante : PHP Parse error: syntax error, unexpected '
[PHP] Parse error, unexpected T_STRING, expecting ',' or ';' VoirCette erreur, fréquente, se produit notamment lorsqu'un guillemet est présent dans une chaîne délimitée par ce même type de guillemets, par exemple :
Parse error: syntax error, unexpected $end VoirLorsque l'on programme en Php, on se retrouve inévitablement un jour devant ce genre d'erreur: Parse error: syntax error, unexpected $end in Command line code on line 1 En français, ça signifie grossièrement: "Erreur d'analyse du code: il y a une...
PHP - Les fichiers VoirLa gestion des fichiers avec PHP Avec PHP, la création ou la lecture de fichiers est, une fois de plus, assez simple. Il existe une multitude de fonctions dédiées à l'utilisation des fichiers. La communication entre le script PHP et le fichier...
PHP - Récupération de données VoirPHP rend très simple la récupération de données envoyées par l'intermédiaire de formulaires HTML. Création d'un formulaire Grâce à la balise FORM du langage HTML, il est très simple de créer des formulaires comprenant : des champs de saisie des...
PHP - Bases de données VoirPhp permet un interfaçage très simple avec un grand nombre de bases de données. Lorsqu'une base de données n'est pas directement supportée par Php, il est possible d'utiliser un driver ODBC, pilote standard pour communiquer avec les bases de...

1

Groarh, le 13 oct 2008 à 13:44:10
  • +1

Bonjour,
en attendant une réponse ici, je continue mes recherches. Je posterai si j'ai des éléments de solution, afin que ça serve à d'autres. ;)

Répondre à Groarh

2

Groarh, le 13 oct 2008 à 14:58:06

Premiers éléments de réponse.

Après avoir créé le fichier shell miniparser.sh, je l'ai rendu exécutable avec la commande

chmod +x miniparser.sh
Ensuite, je l'ai édité :
php -f index.php > index.parsed.htm
firefox index.parsed.htm
exit


Reste à régler :
- le nom de fichier variable ;
- le passage du fichier en argument.
( M'est avis que ces deux problèmes n'en sont qu'un seul en réalité... )
- J'ai essayé d'utiliser un pipelining pour passer directement le résultat à Firefox, mais ça ne marche pas, je ne suis pas au point sur la syntaxe.
# code qui ne marche pas #
php -f index.php | firefox
Si vous avez une idée...

Je continue à chercher.

Répondre à Groarh

3

Groarh, le 13 oct 2008 à 16:25:23

Solution pour le pipelining, après des heures de lecture (Google n'a pas été très amical cette fois-ci, mais j'ai fini par trouver par hasard sur wikipédia) :

firefox `php -f index.php`


Et finalement, la solution du passage de paramètre avec la variable $1, trouvée sur le site d'un IUT de Paris, répond à presque toutes les autres questions :
#!/bin/bash

if test -f $1
then
firefox `php -f $1`
else
echo "$1 : fichier introuvable"
fi
Ça marche à merveille, sauf que... sous OpenSUSE, je me suis rendu compte que php n'était pas installé. Damn it, fuck'n administrateur réseau à la noix !!


Je laisse tomber pour le glisser-déposer, c'est une vieille habitude prise sous Windows, mais apparemment Gnome n'est pas aussi tolérant : si tu ne poses pas sur un dossier, il ne veut rien entendre.

Le topic est donc résolu, je remercie tous ceux qui m'ont apporté leur aidé précieuse :D
Bonne soirée à tous.

Répondre à Groarh

4

Groarh, le 13 oct 2008 à 18:41:22

Rhaa non, c'est faux, c'est complètement faux ce que j'ai écrit !! Et plus moyen d'éditer !
Je ne peux pas passer le contenu d'un fichier à Firefox, je dois lui passer son nom !

#!/bin/bash

if test -f $1
then
php -f $1 > "$1.htm"
firefox "$1.htm"
else
echo "$1 : fichier introuvable"
fi

Répondre à Groarh

5

Groarh, le 21 sep 2009 à 09:16:36

Hello !
Après presque un an (déjà !), je remonte ce vieux topic avec une question qui s’inscrit dans la continuité. Commençons par présenter l’aspect actuel du script, qui a bénéficié de mes progrets en bash :

#! /bin/bash
# miniparser

if [ -f $1 ]
then
        str=`basename $1`
        tmp=${str%%.php*}.htm
        php -f $1 > $tmp
        firefox file://`pwd`/$tmp
else
        echo "$1 introuvable"
fi

Je dispose en outre d’un script de nettoyage assez primitif :

#! /bin/bash
# cleanup

rm -f *.htm

Ce qui nous amène à ma question :
si j’appelle rm directement dans le script « miniparser », après firefox, celui-ci n’a pas le temps de lire le fichier temporaire. Je me demande donc s’il faut utiliser un délai, ou si je peux dire à l’interpréteur quelque chose du genre :
« attends que Firefox ait fini de lire ce fichier avant d’éxécuter la commande suivante ».

Merci aux âmes charitables qui me répondront :P

Répondre à Groarh

6

jipicy, le 21 sep 2009 à 09:47:24
  • +1

Salut,

Alors on va commencer par éviter le la création d'une variable (${tmp}) et remplacer les quotes inverses (qui ne sont plus utilisées et pas très lisibles) par la syntaxe adéquate ( $(commande) ):

if [ -f $1 ]
then
        php -f $1 > ${1/\.*/.html}
        firefox file://$(pwd)/${1/\.*/.html}
else
        echo "$1 introuvable"
fi

Ensuite, pour ton histoire d'effacer le fichier qu'une fois le programme s'est terminé, il faut utiliser la commande "wait", mais auparavant il faut lancer firefox en arrière-plan (ceci se fait grâce à esperluette "&") et faire une pause avec la commande "wait" qui attend patiemment que le dernier "job" lancé en arrière-plan se termine pour continuer l'exécution des commandes suivantes :
if [ -f $1 ]
then
        php -f $1 > ${1/\.*/.html}
        firefox file://$(pwd)/${1/\.*/.html} &
        wait
        rm -f /$(pwd)/${1/\.*/.html}
else
        echo "$1 introuvable"
fi
;-))

PS. Fait un test avant pour la transformation de la variable :
jp@MDK:~/tmpfs ssh$ echo ${1}
essai.php

jp@MDK:~/tmpfs ssh$ echo ${1/\.*/.html}
essai.html

jp@MDK:~/tmpfs ssh$ echo $(pwd)/${1}
/home/jp/tmpfs/essai.php

jp@MDK:~/tmpfs ssh$ echo $(pwd)/${1/\.*/.html}
/home/jp/tmpfs/essai.html

jp@MDK:~/tmpfs ssh$
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

7

Groarh, le 21 sep 2009 à 10:10:41

Salut,
la grande classe, merci jipicy ;)
La syntaxe $(commande) existe aussi en shell simple (/bin/sh) ? Sinon, ça explique pourquoi je suis passé à côté…
Peux-tu m’en dire plus sur la manip ${var/regexp/} ?

Et encore une question, ne vaut-il pas mieux utiliser une variable temporaire plutôt que faire appel trois fois à une regexp ?

Répondre à Groarh

8

jipicy, le 21 sep 2009 à 10:35:32

Re-

Oui la syntaxe existe aussi pour le "shell sh", qui sur beaucoup de distribution récente est en fait le shell "bash" (/bin/sh/ est bien souvent un lien symbolique pointant sur /bin/bash) :

jp@MDK:~/tmpfs ssh$ ls -l /bin/sh
lrwxrwxrwx  1 root root 4 déc 15  2005 /bin/sh -> bash*
jp@MDK:~/tmpfs ssh$

Sinon, concernant la "regex", ce n'est pas gênant dans la mesure où c'est à défaut de regex plutôt une implémentation naturelle dans le shell...

Voir à ce sujet le man bash et plus particulièrement le la partie "Remplacement des paramètres".

;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

9

Groarh, le 21 sep 2009 à 13:51:52

Ok merci ;)

Voici ma version, j’utilise quand même une variable temporaire pour alléger le code :

#! /bin/bash

if [ -f $1 ]
then
        tmp=$(basename ${1/\.php*/.htm})
        php -f $1 > $tmp
        firefox file://$(pwd)/$tmp &
        wait
        rm -f $tmp
else
        echo "$1 introuvable"
fi

Répondre à Groarh

10

jipicy, le 21 sep 2009 à 14:06:17

Tu aurais pu tout aussi bien :

#! /bin/bash

if [ -f $1 ]
then
        html="${1/\.*/.html}"
        php -f $1 > ${html}
        firefox file://$(pwd)/${html} &
        wait
        rm -f /$(pwd)/${html}
else
        echo "$1 introuvable"
fi
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

11

 Groarh, le 21 sep 2009 à 14:15:02

Ok, mais ça me paraît logique de poser le fichier temporaire dans le working dir. Si jamais il y a un crash avant le rm, je le retrouverai plus facilement…

Répondre à Groarh