Aller au contenu

function en PHP


Sujets conseillés

Posté (modifié)

Bonjour à tous...

j'ai ecrit unefunction en PHP qui traite du code style Wiki !

J'ai deux serveurs de développement ...

un en interne au travail, et un pour montrer l'avancement à des personnes externes à mon développement !

Mon soucis est au niveau du code utilisé pour implémenter les listes (ul, li) correctement ...

Sur mon serveur en interne, que j'administre personnellement, le code de la function execute bien ce pour quoi, je l'ai créée ( témoin image 1 - voir plus bas ! )

Sur le serveur extérieur, administré par mon hébergeur, le code ne s'exécute pas correctement, apparement il ne traite pas mon code correspondant à un </ul> (témoin image 2 - voir plus bas aussi)

Dans les deux cas, le fichier de function est le même ainsi que les fichiers traités !

Du coup, je ne sais pas quoi en penser, ni que faire ...

sachant, que sur les deux serveurs, je suis allé à supprimer tous les fichiers du site pour les renvoyer !

PS: Les listes sont remarquables par la présence d'une bordure grise visuelle, sur les deux images !

PS 2 : suivent ci-après le code de la function, et les deux images témoins...

La fonction PHP :

function code2xhtml($var) { // changer les symboles en xhtml !
   if(ereg("^\#", $var)) {
       if(preg_match("/^(#{3})/", $var))
           $var = preg_replace("/^(#{3})(.+)(#{3})$/", "<h3>$2</h3>\n", $var); // h3
       elseif(preg_match("/^(#{2})/", $var))
           $var = preg_replace("/^(#{2})(.+)(#{2})$/", "<h2>$2</h2>\n", $var); // h2
       elseif(preg_match("/^(#)/", $var))
           $var = preg_replace("/^(#)(.+)(#)$/", "<h1>$2</h1>\n", $var); // h1
   }
   elseif(preg_match("/^(\()/", $var))
           $var = preg_replace("/^(\()$/", "<ul>\n", $var); // <ul>
   elseif(preg_match("/^(\*)/", $var))
       $var = preg_replace("/^(\*)(.+)(\*)$/", "<li>$2</li>\n", $var); // <li>
   elseif(ereg("^(\`)", $var)) {
       if(preg_match("/^(\`dl)/", $var))
           $var = preg_replace("/^(\`dl)\|(.+)$/", "<dl class=\"$2\">\n", $var); // <dl>
       if(preg_match("/^(\`dt)/", $var))
           $var = preg_replace("/^(\`dt)\|(.+)$/", "<dt>$2</dt>\n", $var); // <dt>
       elseif(preg_match("/^(\`)/", $var)) {
           $var = preg_replace("/^(\`)(.+)(\`)$/", "<dd>$2</dd>\n", $var); // <dd>
           if($var == "<dd> </dd>\n") $var = "<dd> </dd>\n";
       }
   }
   elseif(preg_match("/^(\)dl)/", $var))
           $var = preg_replace("/^(\)dl)$/", "</dl>\n", $var); // </dl>    
   elseif(preg_match("/^(\))/", $var))
           $var = preg_replace("/^(\))$/", "</ul>\n", $var); // </ul>
   else {
       if($var == "") $var ="<p> </p>\n"; // <p> vide !
       else $var = "<p>$var</p>\n"; // <p>
   }
   return($var);
}

Témoin image 1 - correct (selon moi) : fonction_liste_correct.jpg

Témoin image 2 - incorrect (selon moi) : fonction_liste_incorrect.jpg

Modifié par ste
  • 2 semaines plus tard...
Posté (modifié)

Après un examen plus attentif, de la function que j'ai créé, et questionnement auprès de mon hébergeur extérieur...

Il se pose la question suivante :

Vu que sur mon serveur, la version de PHP est la suivante (Version: 4:4.1.2-6woody3), et que chez mon hébergeur, la sienne (PHP 4.3.4) ... est-ce qu'il est possible que d'une version à l'autre, le code de ma function soit interprété différement ?

En fait, je me rend compte que chez mon hébergeur extérieur, ce sont les règles concernant </ul>, et les <p> qui ne fonctionnent pas !!!

J'ai légèrement modifié ma function (allégement de code, ni = ni - !!!) :

function code2xhtml($var) { // changer les symboles en xhtml !
   if(ereg("^\#", $var)) {
       if(preg_match("/^(#{3})/", $var))
           $var = preg_replace("/^(#{3})(.+)(#{3})$/", "<h3>$2</h3>\n", $var); // h3
       elseif(preg_match("/^(#{2})/", $var))
           if(ereg("\|", $var)) $var = preg_replace("/^(#{2})(.+)\|(.+)(#{2})$/", "<h2 class=\"$2\">$3</h2>\n", $var); // h2
           else $var = preg_replace("/^(#{2})(.+)(#{2})$/", "<h2>$2</h2>\n", $var); // h2
       elseif(preg_match("/^(#)/", $var))
           $var = preg_replace("/^(#)(.+)(#)$/", "<h1>$2</h1>\n", $var); // h1
   }
   elseif(preg_match("/^\($/", $var))
           $var = preg_replace("/^\($/", "<ul>\n", $var); // <ul>
   elseif(preg_match("/^\*/", $var))
       $var = preg_replace("/^(\*)(.+)(\*)$/", "<li>$2</li>\n", $var); // <li>
   elseif(ereg("^(\`)", $var)) {
       if(preg_match("/^\`dl/", $var))
           $var = preg_replace("/^(\`dl)\|(.+)$/", "<dl class=\"$2\">\n", $var); // <dl>
       if(preg_match("/^\`dt/", $var))
           $var = preg_replace("/^(\`dt)\|(.+)$/", "<dt>$2</dt>\n", $var); // <dt>
       elseif(preg_match("/^\`/", $var)) {
           $var = preg_replace("/^(\`)(.+)(\`)$/", "<dd>$2</dd>\n", $var); // <dd>
           if($var == "<dd> </dd>\n") $var = "<dd> </dd>\n";
       }
   }
   elseif(preg_match("/^\)dl$/", $var))
           $var = preg_replace("/^\)dl$/", "</dl>\n", $var); // </dl>    
   elseif(preg_match("/^\)$/", $var))
           $var = preg_replace("/^\)$/", "</ul>\n", $var); // </ul>
   else {
       if($var == "") $var ="<p> </p>\n"; // <p> vide !
       elseif(preg_match("/^\{p/", $var)) $var = preg_replace("/(\{p)\|([^\]]*)\|([^\]]*)(\})/", "<p class=\"$2\">$3</p>\n", $var); // mise en gras
       else $var = "<p>$var</p>\n"; // <p>
   }
   return($var);
}

Modifié par ste
Posté

Bonjour,

il me semblerait plus judicieux de regarder le code html de ce que te donne cette fonction. Tu compares les code source html ( et non l'affichage à l'écran ) et :

- si les 2 ne sont pas pareil, alors c'est un problème de navigateur

- sinon, je ne sais pas trop. Mais...

Ca m'étonnerait que php interprète différemment des fonctions aussi simples que les preg et les ereg.

Eventuellement, postes le code html.

Anonymus.

Posté
Bonjour,

il me semblerait plus judicieux de regarder le code html de ce que te donne cette fonction. Tu compares les code source html ( et non l'affichage à l'écran ) et :

- si les 2 ne sont pas pareil, alors c'est un problème de navigateur

- sinon, je ne sais pas trop. Mais...

Ca m'étonnerait que php interprète différemment des fonctions aussi simples que les preg et les ereg.

Eventuellement, postes le code html.

Anonymus.

Les codes sources sont forcèment différent, et le sont, puisque la function est interprétée différement bel et bien, aussi étrange que cela puisse paraître !!!

C'est vraiment un fait, une constatation...

Et montre le code xhtml ne servirait à rien puisque c'est cette function qui encode !

De même, ce n'est pas du à une défaillance de navigateur, car que ce soit MSIE ou Moz, c'est pareil... Quant au rendu visuel, c'est le rendu esthétique du code mal interprété ou non ! L'image deux donne ce visuel, car ne sont pas interprétés sur l'hébergeur extérieur le balisage, style wiki, par ma function PHP.

J'insiste certes, mais c'est vraiment un problème d'interprétation...

Et, je ne sais comment le résoudre !

Si tu as besoin de t'en convaincre, voici le code xhtml retourné par la function sur mon serveur interne :

<div id="texte">
<div id="sousm">
<a name="sousmenu" ></a>
<map id="sousmenu" title="Menu de navigation de second niveau">
<h3>Formations Agricole</h3>
<ul>
<li><a accesskey="s" href="enseignement/presentation/" title="Présentation du Centre de Formation..." tabindex="20">le C.F.P.P.A.</a></li>

<li><a href="enseignement/formation/" title="Formations professionnelles, FOAD, Formations Européennes, Stages et autres partenariats" tabindex="21">Les Formations du C.F.P.P.A.</a></li>
<li><a href="enseignement/information/" title="Remplir le formulaire pour obtenir plus d'informations sur nos formations." tabindex="22">Obtenir des renseignements</a></li>
<li><a href="enseignement/modalite/" title="Les conditions à remplir pour s'inscrire !" tabindex="23">S'inscrire</a></li>
<li><a href="enseignement/historique/" title="Présentation de l'Histoire du Centre de Formation..." tabindex="24">Histoire du Centre</a></li>
<li><a href="enseignement/adresses/" title="Présentation des différents collaborateurs du Centre de Formation." tabindex="25">Dialoguer avec...</a></li>
<li><a href="enseignement/plan/" title="Plan et indications pour arriver sur les lieux !" tabindex="26">Comment venir ici</a></li>
</ul>
</map>
</div>

<h1>L'Enseignement Agricole</h1>
<p> </p>
<p>L'Etablissement Public Local d'Enseignement et de Formation Professionnelle pour Adultes de Ste Livrade sur Lot (EPLEFPA) est un complexe réunissant trois établissements de formation agricole :</p>
<ul>
<li> le Centre de Formation Professionnelle et de Promotion Agricole de Sainte-Livrade (CFPPA),</li>
<li> le Centre Départemental de Formation d'Apprentis Agricoles du Lot-et-Garonne (CDFAA 47),</li>
<li> le Lycée d'Enseignement Général et Technologique Agricole "Etienne Restat" (LEGTA).</li>

</ul>
<p>Il comprend également deux organismes ne proposant pas de formations :</p>
<ul>
<li> une exploitation agricole pédagogique,</li>
<li> Insertel : une association spécialisée dans la télé-activité, </li>

</ul>
<p>L'EPLEFPA est un établissement public du Ministère de l'Agriculture, de la Pêche et de l'Alimentation. Il a 5 missions :</p>
<ul>
<li> l'enseignement et la formation professionnelle,</li>
<li> l'expérimentation et le développement agricole,</li>
<li> l'animation en milieu rural,</li>

<li> la coopération internationale,</li>
<li> l'insertion sociale et professionnelle.</li>
</ul>
<p class="haut"><a href="/cfppa/enseignement/#haut" title="Remonter en haut de la page...">^ Là-Haut ^</a></p>

</div>

Le code ainsi retourné est bel et bien ce que je désire !

Quant au code xhtml retourné par l'hébergeur extérieur { http://devepl.stephane-huc.net/cfppa/enseignement/ } :

<div id="texte">
<div id="sousm">

<a name="sousmenu" ></a>
<map id="sousmenu" title="Menu de navigation de second niveau">
<h3>Formations Agricole</h3>
<ul>
<li><a accesskey="s" href="enseignement/presentation/" title="Présentation du Centre de Formation..." tabindex="20">le C.F.P.P.A.</a></li>
<li><a href="enseignement/formation/" title="Formations professionnelles, FOAD, Formations Européennes, Stages et autres partenariats" tabindex="21">Les Formations du C.F.P.P.A.</a></li>
<li><a href="enseignement/information/" title="Remplir le formulaire pour obtenir plus d'informations sur nos formations." tabindex="22">Obtenir des renseignements</a></li>
<li><a href="enseignement/modalite/" title="Les conditions à remplir pour s'inscrire !" tabindex="23">S'inscrire</a></li>

<li><a href="enseignement/historique/" title="Présentation de l'Histoire du Centre de Formation..." tabindex="24">Histoire du Centre</a></li>
<li><a href="enseignement/adresses/" title="Présentation des différents collaborateurs du Centre de Formation." tabindex="25">Dialoguer avec...</a></li>
<li><a href="enseignement/plan/" title="Plan et indications pour arriver sur les lieux !" tabindex="26">Comment venir ici</a></li>
</ul>
</map>
</div>
<h1>L'Enseignement Agricole</h1>
L'Etablissement Public Local d'Enseignement et de Formation Professionnelle pour Adultes de Ste Livrade sur Lot (EPLEFPA) est un complexe réunissant trois établissements de formation agricole :<ul>

<li> le Centre de Formation Professionnelle et de Promotion Agricole de Sainte-Livrade (CFPPA),</li>
<li> le Centre Départemental de Formation d'Apprentis Agricoles du Lot-et-Garonne (CDFAA 47),</li>
<li> le Lycée d'Enseignement Général et Technologique Agricole "Etienne Restat" (LEGTA).</li>
)Il comprend également deux organismes ne proposant pas de formations :<ul>

<li> une exploitation agricole pédagogique,</li>
<li> Insertel : une association spécialisée dans la télé-activité, </li>
)L'EPLEFPA est un établissement public du Ministère de l'Agriculture, de la Pêche et de l'Alimentation. Il a 5 missions :<ul>

<li> l'enseignement et la formation professionnelle,</li>
<li> l'expérimentation et le développement agricole,</li>
<li> l'animation en milieu rural,</li>
<li> la coopération internationale,</li>
<li> l'insertion sociale et professionnelle.</li>

)<p class="haut"><a href="/cfppa/enseignement/#haut" title="Remonter en haut de la page...">^ Là-Haut ^</a></p>

</div>

C'est exactement le même texte qui est traité au bit propre, par la même function PHP... l'examen du code retourné par l'hébergeur extérieur permet de se rendre compte que ma function, sur celui-ci, ne gère pas l'équivalence </ul>, <p>, </p>....

Posté

Ca ne répond pas forcément à ta question, mais....

dans le morceau de code qui suit, il y a une erreur (enfin.. je pense) :

   elseif(preg_match("/^(\)dl)/", $var)) 
          $var = preg_replace("/^(\)dl)$/", "</dl>\n", $var); // </dl>    
  elseif(preg_match("/^(\))/", $var))
          $var = preg_replace("/^(\))$/", "</ul>\n", $var); // </ul>
  else {
      if($var == "") $var ="<p> </p>\n"; // <p> vide !
      else $var = "<p>$var</p>\n"; // <p>
  }
  return($var);
}

Comptes le nombre de parenthèses, et tu verras qu'elles ne correspondent pas à ce que tu souhaites obtenir.

Pour les parsers xml, xhtml, etc, je sais qu'il y a des différences entre les versions, mais je n'arrive pas à trouver des textes en faisant mention. Tu es peut etre tombé sur un changement mineur entre 2 versions, ou sur un bug :D

Vois déjà ce que donne ces modifs, on verra ensuite pour les textes qui en parlent ;)

Tiens nous au courant.

A+, Anonymus.

Posté
   elseif(preg_match("/^(\)dl)/", $var)) 
          $var = preg_replace("/^(\)dl)$/", "</dl>\n", $var); // </dl>    
  elseif(preg_match("/^(\))/", $var))
          $var = preg_replace("/^(\))$/", "</ul>\n", $var); // </ul>
  else {
      if($var == "") $var ="<p> </p>\n"; // <p> vide !
      else $var = "<p>$var</p>\n"; // <p>
  }
  return($var);
}

Comptes le nombre de parenthèses, et tu verras qu'elles ne correspondent pas à ce que tu souhaites obtenir.

Pour les parsers xml, xhtml, etc, je sais qu'il y a des différences entre les versions, mais je n'arrive pas à trouver des textes en faisant mention. Tu es peut etre tombé sur un changement mineur entre 2 versions, ou sur un bug :D

Vois déjà ce que donne ces modifs, on verra ensuite pour les textes qui en parlent ;)

Tiens nous au courant.

A+, Anonymus.

D'où la réécriture de ma function, donnée à nouveau juste au-dessus !!!

(cf : post Ecrit le jeudi 22 avril 2004, 16:14 )

elseif(preg_match("/^\)dl$/", $var))
          $var = preg_replace("/^\)dl$/", "</dl>\n", $var); // </dl>    
  elseif(preg_match("/^\)$/", $var))
          $var = preg_replace("/^\)$/", "</ul>\n", $var); // </ul>
  else {
      if($var == "") $var ="<p> </p>\n"; // <p> vide !
      elseif(preg_match("/^\{p/", $var)) $var = preg_replace("/(\{p)\|([^\]]*)\|([^\]]*)(\})/", "<p class=\"$2\">$3</p>\n", $var); // mise en gras
      else $var = "<p>$var</p>\n"; // <p>
  }
  return($var);
}

Qui ne change pas le soucis ! ;):(

Posté

Bonjour,

désolé pour les temps de réponse un peu longs...

Je pense que les problèmes viennent de là :

Ton php tourne sous windows, alors que celui de ton hébergeur tourne sous linux.

Windows gère les caractères de fin de ligne et de retour chariot différemment de linux.

Lorsque tu executes ta fonction, tu poses la question : que reste t-il ?

Et la dernière condition, de la dernière condition, gère les cas par défaut.

Autrement dit : Lorsqu'il n'a rien à se mettre sous la dent, il execute la dernière ligne :

else $var = "
$var\n"; // 

qui signifie : sinon, dans tous les autres cas, executer ce code.

Tu sais qu'il existe toujours ces retour chariots et passage à la ligne, or lorsque tu testes ton '$var', il y a toujours un \n et \r résiduels. C'est de là que vient l'erreur.

Si ton php (la version) tournait sous linux, tu n'aurais pas ce problème. Là, tu as un pb pour 2 raisons :

- Tu mets une valeur par défaut : else...else $var = "<p>$var</p>\n"; // <p>

- tu fais tourner sous windows : il reste un \r.

Le fait qu'il reste un \r sous windows se retrouve dans ta fonction à 2 emplacements (au moins, apparemment) :

$var = preg_replace("/^(\))$/", "</ul>\n", $var); // </ul>

et

else $var = "<p>$var</p>\n"; // <p>

ces 2 cas ne testent pas si le \ est un \r, et se font 'piéger' par le système windows.

Fais un essai, en enlevant la dernière condition, et en mettant une condition pour l'avant dernière.

et... tiens nous au courant ;)

Anonymus.

Posté
Bonjour,

désolé pour les temps de réponse un peu longs...

Je pense que les problèmes viennent de là :

Ton php tourne sous windows, alors que celui de ton hébergeur tourne sous linux.

Windows gère les caractères de fin de ligne et de retour chariot différemment de linux.

et... tiens nous au courant ;)

Anonymus.

Elo,

Anonymous, d'où me sors-tu que mon server fonctionne sous Windows... ?

Va falloir que tu m'expliques là !!!

Parce que ce n'est pas le cas, du tout ! C'est une bonne distri Debian GNU/Linux 3.0rc2, mis-à-jour, régulierement, que j'ai installé perso, au travail, y'a des mois de cela !!!

Avec, bien sûr les services, et rien que les services, dont j'ai besoin ...

Je suis vraiment surpris de ta conclusion ! Mais, rassures-toi, je ne t'en veux guère...

Posté

J'avais cru lire que tu avais installé easyphp. Vraiment désolé :(

Il n'empèche que le reste est surement vrai, c'est probablement un problème de retour chariot, autrement dit, un \n \r qui traine.

T'as debian/linux au boulot et chez toi ?

Anonymus.

Posté
T'as debian/linux au boulot et chez toi ?

Non... J'ai Debian GNU/Linux au travail, c'est mon serveur interne, et l'hébergeur est aussi sous linux !

Mais il est vrai que je code sous Windows, avec un utilitaire qui se nomme Scite... très léger, très bien pour attaquer le code mano ! ;)

P.S. : Et, oui, j'ai aussi Debian GNU/Linux _AT_home, où je viens d'installer tous ces packages car je veux tester en local @ home, pour avoir le rendu !!!

Posté

Tu peux essayer, s'il te plait, cette fonction ?

je suis un peu tétu, or je pense que l'erreur vient de là. Non pas d'utiliser linux, mais d'un problème de retour chariot (caractère \r) ;)

$fp = fopen("test.txt","r");
$temp=0;
while(! feof($fp)){
if (ereg("\r",fgets($fp),$array))echo "trouvé, ligne $temp<br>";
$temp++;
}
fclose($fp);

Anonymus.

  • 2 semaines plus tard...
Posté

bonjour a tous

Excusez moi d interrompre votre discutions c est que j ai un petit bleme au niveau du php .

comment faire pour afficher un truk apartir de ma bdd dans un champs d un formulaire ?

merci d avance

aidez moi ca urge :wacko:

Posté

Il te faut, dans un premier temps, 'dépiler' ta table, puis dans un second temps, remplir le formulaire avec les champs correspondants.

Quelle est la structure de ta table ? quelle est la structure de ton formulaire ?

Anonymus.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...