bonjour,
Je suis dans un cas un peu particulier : je depoussiere un site que j'avais commence sous windows. entretemps, je suis passe a 100% sous linux ( ce qui pose parfois qq probleme pour les test de compatibilite ) qui m'avait mis en UTF8 par defaut. je l'ai donc force a repasser en ISO, apres m'etre apercu que ca buggait au niveau des encodages des accents ( je travaille en php, avec des script qui font automatiquement la conversion caractere accentues -> code HTM correspondant ).
Cette fois, je bloque sur un autre probleme, qui pourrait etre lie a l'encodage, meme si je crois avoir reenregistré tout mes fichier en ISO :
je travaille sur une interface d'edition d'article, avec implementation d'un langage de mise en forme simplifié ( genre un CMS maison ). j'en suis a aborder le point délicat de la création des paragraphes à partir des retours a la ligne. j'ai donc construit une expression reguliere qui remplace les suites de \n par des </p><p>, sauf quand ce \n suit directement une balise </hn>. ( que voici pour ceux a qui ca parle : #(?<!</h[1-3]>)(\n+)# .

j'ai teste cette expression sur un site fait pour ca pour la mettre au point ( http://www.lumadis.be/regex/test_regex.php ), et dessus elle fonctionne parfaitement. quant je la teste chez moi, en revanche, c'est une autre histoire. voici les resultats obtenus :

le texte de test :



<h1>titre</h1>
salut tout le monde !
ca va ?


bien ?


le reultat (correct) renvoye par le testeur :



<h1>titre</h1>
salut tout le monde !</p><p>ca va ?</p><p>bien ?


et le resultat faux renvoyé par mon script :


<h1>titre</h1>
</p><p>salut tout le monde !
</p><p>ca va ?
</p><p>
</p><p>
</p><p>bien ?


vous noterez egalement que dans ce que me renvoie mon script, les retours a la ligne ont ete conservé, alors qu'il y a des </p><p> malgre tout. tout se passe comme si il y avait un autre caractere de retour a la ligne different de \n qui se placait juste avant le \n, il me semble que c'est la seule explication coherente. bien sur, j'ai pense au \r de windows, mais :
1. je suis sous linux Smiley smile
2. le meme probleme devrait apparaitre dans le testeur
3. j'ai essaye de faire au prealable un str_replace('\r','',$texte), ca ne change rien.
donc, ma question ( enfin ) c'est de savoir si ce probleme pourrais venir d'une histoire d'encodage ( si oui, de quoi ? ), si l'UTF8 avait une maniere specifique de coder les retours a la ligne, ou si j'avais fait une connerie. je sais que ce probleme a en apparence plus de rapport avec le PHP, mais ca concerne aussi l'encodage, alors si quelqu'un voit, je commence vraiment a m'arracher les cheveux.....

Merci d'avoir tout lu ( ouf ! ) !
Modifié par jobherzt (27 Nov 2005 - 14:56)
Administrateur
Bonjour,

il manque un premier <p> après le dernier titre précédant le 1er paragraphe et un </p> final, bon arrachage de cheveux pour le <p> Smiley cligne (un </h?> pas suivi par "(0 et + espaces, retours chariots)<h?>" pitêtre?)

Pourrais-tu apporter plus de précisions sur ta méthodologie: un exemple de fichier test en ligne, dans l'état où il est actuellement (encodage, etc)
Tu testes ces regexp sur tes anciens fichiers (auquel cas il pourrait y avoir un problème d'encodage et/ou de programmation) ou sur un fichier test créé pour l'occasion et offline (auquel cas il ne peut pas y avoir de problème d'encodage, juste PHP)??
Si test online, il y a encore les entêtes HTTP créés par Apache à vérifier ...
pour le premier <p> et le dernier </p> je les ajoute a part, je n'ai fourni qu'une partie du code. le test qui fonctionne se fait en ligne, sur le site que j'ai indique, en tapant directement un texte et une expression reguliere dans un formulaire ( accessoirement, tres pratique pour mettre au point ses regex et tester la rapidite ).

pour donner un exemple en ligne, je ne prefere pas, vu que ca se fait a partir d'une zone securisee, et que je ne suis pas encore sur que tout l'est parfaitement (securise), donc je ne prefere pas poster un login/pass sur un forum public. j'ai en gros reussi a contourner le probleme, mais je ne sais toujours pas d'ou ca vient.
bizzarement, un str_replace('\r','',$texte) ne donnait rien, mais un preg_replace('#\r#','',$texte) fonctionne ????. à partir de la, il n'y a plus que des \n, donc mon expression reguliere fonctionne cette fois ci, mais je ne comprends pas vraiment pourquoi l'une marche et pas l'autre, et d'ou viennent ces \r alors que tout se passe sous linux. mais vu que mes utilisateurs seront surement sous windows, je comptais virer les \r de toute façon. donc on peut considerer que le probleme est resolu, mais j'aimerais quand meme comprendre ce qui se passe.....

voici le code qui fonctionne :


$texte=preg_replace('#\r#','',$texte);
$texte=preg_replace('#\n+(?!</h[1-3]>)#','</p><p>', $texte);
$texte=preg_replace('#<p>[[:blank:]]*(<h[1-3]>|<ul>)#U','$1',$texte);
$texte=preg_replace('#(</h[1-3]>|</ul>)[[:blank:]]*</p>#U','$1',$texte);


je viens de voir en plus qu'en copiant / collant dans ce post, il apparait des retours a la ligne que je n'ai pas dans mon fichier. je suis completement largué ....

je peux eventuellement te donner un acces temporaire par message prive, mais vu que j'ai fait des modifs, je ne sais pas si ca a encore un interet, dis moi ...
Modifié par jobherzt (27 Nov 2005 - 02:20)
Administrateur
Nonon pas nécessaire Smiley cligne , un exemple réduit présentant le problème suffit et les 4 lignes ci-dessus devraient suffire (aux autres Smiley confused ) pour cerner le problème.
qu'est ce aue tu appelles un exemple reduit ? le test que j'ai mis dans mon premier post suffit il ? parce qu'a priori c'est ca ou l'exemple en ligne. mais comme je te dis, pas de pb pour te donner un acces temporaire, ton statut d'administrateur me donnant assez confiance, mes sauvegardes etant a jour et sachant que je viens d'ajouter la ligne bloquant (theoriquement Smiley smile )l'execution de code PHP dans les articles. mais ca n'est pas une requete de ma part, c'etait seulement au cas ou ca aurait pu t'aider a y voir plus clair ...
merci bien, en tout cas ..

accessoirement, si tu utilises toi meme des regex, et que tu ne connais pas le testeur dont je parle, je te conseille d'y jeter un coup d'oeil, c'est un outil vraiment tres utile. simple, mais il fallait y penser : un bete formulaire, tu entre un texte, une expression reguliere ( ou 2 ), un motif de remplacement, et il se lance. tu peux alors choisir entre : un highlighting des morceaux capturés, ou un comparatif de vitesse entre tes 2 motifs, avec a chaque fois le texte resultat ( apres remplacement )
Modifié par jobherzt (27 Nov 2005 - 02:42)
Bonjour, c'est peut-être parce que les sauts de ligne sont codés \r\n chez toi ?
En règle générale :
Windows = \r\n
Linux = \n
Mac = \r

Pour être sûr : remplace \n par (\r\n|\n|\r) ou un truc similaire
c'est meme sur que c'est ca, vu que c'est sur cette base que j'ai vaguement résolu le probleme. ce qui me surprend, c'est que je suis sous linux .....
Oui, mais j'ai cru comprendre que tu avais été sous windows, un moment donné.
Linux est théoriquement capable de fonctionner avec les deux, \r\n ou \n, mais pas windows. Pour preuve, ouvre un fichier dont les sauts de ligne sont codés par \n dans le notepad : et paf, tous les sauts de ligne ont disparu ! Avec en prime, un symbole cabalistique.
exact, mais la ca se passe quand je traite un texte tape dans un forumlaire. mais tu as raison, pour des raisons obscures ca pourrait venir de la, surtout que j'ai verifie que tous mes fichiers et mon navigateur etait en ISO. myster ... mais bon, ca marche, on va pas se plaindre...