[Résolu][PHP] Problème sur une fonction avec un serveur UNIX

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics


Gaëtan R.
WRInaute impliqué
WRInaute impliqué
 
Messages: 311
Inscription: Lun Avr 26, 2004 16:24

[Résolu][PHP] Problème sur une fonction avec un serveur UNIX

Message le Mer Juin 02, 2004 22:51

Bonjour,

J'ai un souci avec une fonction PHP. :(

J'utilise cette fonction dans plusieurs site et jusque là, aucun souci. Mon script PHP fonctionne aussi bien en local (avec Easy-PHP 1.7) que sur un hébergement avec serveur Linux ou IIS.

Je suis en train de développer un site qui sera sur un hébergement avec serveur Unix.

J'ai des messages d'erreur pour une bête fonction ereg() :
PHP Warning: ereg(): Invalid preceding regular expression in /hermes/data11/b648/toopy/sigmacom/library.inc.php on line 23
alors que tout fonctionne bien en local... :twisted:

J'ai configuré Dreamweaver pour qu'il me fasse des sauts de ligne Unix dans mes scripts.

Si quelqu'un a eu des soucis similaires, ça serait bien de m'orienter. :cry:

Merci d'avance.
Dernière édition par Gaëtan R. le Lun Juil 05, 2004 23:46, édité 2 fois.


deweerdt
WRInaute passionné
WRInaute passionné
 
Messages: 912
Inscription: Mar Aoû 12, 2003 10:41

Message le Mer Juin 02, 2004 23:26

Peux-tu mettre un bout de ton code?

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Jeu Juin 03, 2004 7:24

Tu as la même version de PHP en local et en distant ?
Balance ton expression régulière, je sais que j'avais eu le même problème avant. Windows et Unix/linux ne réagissent pas pareil pour certaines choses.


Gaëtan R.
WRInaute impliqué
WRInaute impliqué
 
Messages: 311
Inscription: Lun Avr 26, 2004 16:24

Message le Jeu Juin 03, 2004 14:29

Oui, c'est exactement la même version en local qu'en distant, à savoir la 4.3.3.

C'est bizarre que ça puisse venir de la fonction puisque cela fonctionne très bien sur d'autres serveurs.

Voila la ligne incriminée :
while(ereg("{([^ ]{1,})}",$ligne,$tag)){


Gaëtan R.
WRInaute impliqué
WRInaute impliqué
 
Messages: 311
Inscription: Lun Avr 26, 2004 16:24

Message le Dim Juin 06, 2004 18:32

Personne qui pourrait m'aider ? :?

L'adresse du site en cours de développement : ht-tp://www.toopy.com/sigmacom

Les balise genre {references} ou {menu} sont remplacées par le contenu approprié de la base de données MySql.

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Lun Juin 07, 2004 14:08

(je surveille les réponse de ce sujet donc j'oublierai pas de répondre ce coup ci ;))

Que cherches tu à faire avec cette expression régulière au passage ?

Normalement, dans le 2° paramètre de la fonction, si tu veux récupérer le contenu de la parenthèse de capture, il faut utiliser \\n ou $n (n étant le numéro du masque de capture, n commençant à 1).
J'aurais déjà vu ça :

Code: Tout sélectionner
while(ereg("{([^ ]+)}","$1",$tag)){


(si $1 marche pas en local, essaie "\\1" )


Gaëtan R.
WRInaute impliqué
WRInaute impliqué
 
Messages: 311
Inscription: Lun Avr 26, 2004 16:24

Message le Mer Juin 09, 2004 15:37

Je pense avoir saisi d'où pouvait venir mon problème, d'après http://didou.keliglia.com/php/phpman/in ... =ref.regex à propos des expressions régulières de type POSIX.
Ces expressions rationnelles ne sont pas compatibles avec les données binaires. Les expressions PCRE le sont.


Donc, j'ai changé mon code en utilisant une expression régulière compatible Perl : preg_match().

Pour rappel, avant :
Code: Tout sélectionner
ereg("{([^ ]{1,})}",$ligne,$tag)


Une fois modifiée :
Code: Tout sélectionner
preg_match(("{([^ ]{1,})}",$ligne,$tag)


Seulement, ça ne fonctionne pas ; il y a un blocage dans la fonction.

Ça ne fonctionne pas, je pense, à cause des délimiteurs. Je recherche dans ma page tout ce qui est de la forme :
Code: Tout sélectionner
{truc}

Si quelqu'un pouvait me donner un coup de main, ça serait vraiment bien parce que là je m'en sort vraiment pas. :(


George Abitbol
WRInaute accro
WRInaute accro
 
Messages: 1923
Inscription: Ven Juin 06, 2003 7:57

Message le Mer Juin 09, 2004 15:43

Code: Tout sélectionner
preg_match_all('/\{[^{]+\}/', $ligne, $tag);


Fred


Gaëtan R.
WRInaute impliqué
WRInaute impliqué
 
Messages: 311
Inscription: Lun Avr 26, 2004 16:24

Message le Mer Juin 09, 2004 16:53

On avance, on avance, merci Fred :wink:

Mais (eh oui, il y a un mais) c'est pas encore résolu :evil:, ma fonction passe,ça me trouve ma valeur entre crochet mais ça la remplace par rien du tout.

Message d'erreur suivant dans mes logs...
Code: Tout sélectionner
PHP Notice:  Undefined offset:  1 in /hermes/data11/b648/toopy/test/library.php on line 9
PHP Notice:  Undefined offset:  1 in /hermes/data11/b648/toopy/test/library.php on line 6
PHP Notice:  Undefined offset:  1 in /hermes/data11/b648/toopy/test/library.php on line 9
PHP Notice:  Undefined offset:  1 in /hermes/data11/b648/toopy/test/library.php on line 7
PHP Notice:  Undefined offset:  1 in /hermes/data11/b648/toopy/test/library.php on line 6
:cry:

Donc y'a forcément un truc qui passe pas quelque part... Allez, hop, j'y retourne :!:


George Abitbol
WRInaute accro
WRInaute accro
 
Messages: 1923
Inscription: Ven Juin 06, 2003 7:57

Message le Mer Juin 09, 2004 16:55

Je ne sais pas quel traitement tu essayes de faire, mais si c'est un remplacement, utilise plutôt preg_replace()

Fred


Gaëtan R.
WRInaute impliqué
WRInaute impliqué
 
Messages: 311
Inscription: Lun Avr 26, 2004 16:24

Message le Mer Juin 09, 2004 17:52

Le remplacement se fait ensuite avec un str_replace() ; il y a un test si il y a quelque chose à mettre à remplacer sinon ça met rien.

Je ne perds pas espoir, est-ce que d'autres personnes travaillant sur serveur Unix et développant sur une plate forme windows auraient rencontrés des problèmes de ce type :?:

Je travaille avec des sauts de ligne Unix (LF) configurés avec Dreamweaver et je fais mes upload en binaire. Si il y a d'autres choses à respecter...


George Abitbol
WRInaute accro
WRInaute accro
 
Messages: 1923
Inscription: Ven Juin 06, 2003 7:57

Message le Mer Juin 09, 2004 18:10

Gaëtan R. a écrit:Le remplacement se fait ensuite avec un str_replace() ; il y a un test si il y a quelque chose à mettre à remplacer sinon ça met rien.


Un peu lourd comme traitement, peut-être. Tu pourrais utiliser preg_replace() en combinaison avec l'option E (voir ici), qui interprète la chaîne de remplacement comme du code PHP. Tu peux donc y mettre une fonction perso qui ferait le test et renverrait selon les cas l'élément par lequel remplacer ton {...}

Exemple simplifié :

Code: Tout sélectionner
<?php
function blabla($c) {
   if ($c != '123') {
      return 'chips';
   }
   else {
      return '';
   }
}

$chaine = 'ma chaine avec des {trucs} et des {bidules} partout ! {123}';

echo preg_replace('/\{([^}]+)\}/e', 'blabla($1)', $chaine);
?>


Bon, l'exemple est très con et donnera ma chaine avec des chips et des chips partout ! mais c'était juste pour te montrer le principe.

Pour le reste, je ne peux pas t'aider, je ne suis pas sous Windows.

Fred

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Jeu Juin 10, 2004 8:36

En fait j'vais te filer une astuce pour améliorer la lisiblité de l'expression régulière :
Code: Tout sélectionner
echo preg_replace("#\{([^}]+)\}#e"', "blabla('$1')", $chaine);


Avec les # je trouve que ça passe mieux.

PS : sinon j'aurais donné la même solution, un preg_match + str_replace non C pas top ;) là tu fais tout en un coup.

Xethorn
Nouveau WRInaute
 
Messages: 40
Inscription: Jeu Juin 10, 2004 16:43

Message le Jeu Juin 10, 2004 16:52

Ta réponse est pas trop mal mais elle n'est pas sécurisé, et il suffit d'une seule double quote pour faire planter l'intégralité du système. Il faut convertir toutes les quotes (qu'elles soient doubles ou simples) avant de faire un traitement (ou effectuer un addslashes() mais là il y en aura à toutes les sauces et sur toutes les lignes).

Les regex c'est bien mais à consommer avec modération.

Ps : essaye de mettre dans ton texte une variable genre "$var" dans ton code php "$var='une valeur'", lance ta regex, tu risques fort d'être surpris :)

Oncle Tom
WRInaute passionné
WRInaute passionné
 
Messages: 812
Inscription: Lun Mar 31, 2003 11:16

Message le Jeu Juin 10, 2004 17:52

Ouais c'est sûr. Dans mon cas personne (comprendre : mon site)l j'exécute des remplacements sur des occurences connues donc j'ai aucun soucis ;)

[Résolu][PHP] Problème sur une fonction avec un serveur UNIX

Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par Julien Coquet, expert certifié officiellement par Google Analytics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités