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

WRInaute discret
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.
 
WRInaute impliqué
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.
 
WRInaute discret
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)){
 
WRInaute discret
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.
 
WRInaute impliqué
(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:
 while(ereg("{([^ ]+)}","$1",$tag)){

(si $1 marche pas en local, essaie "\\1" )
 
WRInaute discret
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:
ereg("{([^ ]{1,})}",$ligne,$tag)

Une fois modifiée :
Code:
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:
{truc}
Si quelqu'un pouvait me donner un coup de main, ça serait vraiment bien parce que là je m'en sort vraiment pas. :(
 
WRInaute discret
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:
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 :!:
 
WRInaute discret
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...
 
WRInaute passionné
Gaëtan R. a dit:
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:
<?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
 
WRInaute impliqué
En fait j'vais te filer une astuce pour améliorer la lisiblité de l'expression régulière :
Code:
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.
 
Nouveau WRInaute
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 :)
 
WRInaute impliqué
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 ;)
 
WRInaute discret
Bon, un peu moins d'un mois après, je me suis de nouveau penché sur mon souci, étudié de près les fonctions régulières, testé vos solutions pour enfin trouver une solution. 8)

En conclusion, je sais maintenant que les expressions régulières compatible PERL sont préférables à celles de type POSIX de par leur rapidité et du fait qu'elles fonctionnent parfaitement avec des données binaire (sur mon serveur Unix par exemple).

Je remercie tout ceux qui m'ont apportés leur aide sur ce topic, je suis maintenant sorti de ce mauvais pas. :D

Le résultat final : -http://www.toopy.com/sigmacom.

N"hésiter pas à me faire part de vos avis, ce n'est pas encore la version finale.
 
Discussions similaires
Haut