Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3248 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [php] Remplace tout les \n entre "" dans une chaine

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[php] Remplace tout les \n entre "" dans une chaine

n°1548209
simoes
Posté le 24-04-2007 à 15:56:17  profilanswer
 

Hello,
 
voila je sèche sur un problème, je désire remplacer tous les \n entre des " " mais je trouve pas de solutions
 
j'ai bien essayer avec un str_replace, le problème c'est qu'il me les remplace tous mais ceux qui ne sont pas entre " ".
 
Merci de votre aide...

mood
Publicité
Posté le 24-04-2007 à 15:56:17  profilanswer
 

n°1548212
MagicBuzz
Posté le 24-04-2007 à 15:59:36  profilanswer
 

regexp

n°1548215
simoes
Posté le 24-04-2007 à 16:01:42  profilanswer
 

il y a aurait quelqu'un qui métrise les regexp? car j'ai essayer sans succès....

n°1548229
MagicBuzz
Posté le 24-04-2007 à 16:20:02  profilanswer
 

le mieux c'est de trouver un exemple tout fait, parcequ'à moins d'être autiste...

n°1548281
Pablo Escr​obarbe
Retour d'exil
Posté le 24-04-2007 à 17:30:10  profilanswer
 

Tu veux remplacer par quoi?

n°1548288
Pablo Escr​obarbe
Retour d'exil
Posté le 24-04-2007 à 17:36:05  profilanswer
 

Bah je vois pas du tout ce qu'il y a de dur là. Suffit de regarder n'importe quel tuto sur les regexp.

n°1548291
zecrazytux
Posté le 24-04-2007 à 17:40:26  profilanswer
 

j'ai rien compris a ce que tu veux faire...


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
n°1548293
Pablo Escr​obarbe
Retour d'exil
Posté le 24-04-2007 à 17:41:16  profilanswer
 

Han MagicBuzz a supprimé discretos un message :o

n°1548295
zecrazytux
Posté le 24-04-2007 à 17:42:16  profilanswer
 

:D ounaÿd :p
 
 
keskidisais comme conenrie ? :love:


Message édité par zecrazytux le 24-04-2007 à 17:42:32

---------------
Blog photo/récits activités en montagne http://planetcaravan.net
n°1548297
Pablo Escr​obarbe
Retour d'exil
Posté le 24-04-2007 à 17:43:29  profilanswer
 

Que ça devait être surement par "<br/>"

mood
Publicité
Posté le 24-04-2007 à 17:43:29  profilanswer
 

n°1548298
MagicBuzz
Posté le 24-04-2007 à 17:43:41  profilanswer
 

Pablo Escrobarbe a écrit :

Han MagicBuzz a supprimé discretos un message :o


ben ouais, parceque je trouvais pas mon intervention très utile :p

n°1548299
Pablo Escr​obarbe
Retour d'exil
Posté le 24-04-2007 à 17:44:42  profilanswer
 

C'est pas grave les fachos sont pas là \o]

n°1548300
MagicBuzz
Posté le 24-04-2007 à 17:45:10  profilanswer
 

Sinon, ça peut aussi être un extract de données, formattées, qui contiennent des \n et il doit les interpréter avec un langage qui prends un autre caractères d'échappement.
 
M'enfin dans tous les cas, je pense pas que ce soit bien important de savoir par quoi il veut remplacer (c'est pour ça que j'avais viré mon post ;))


Message édité par MagicBuzz le 24-04-2007 à 17:45:31
n°1548304
Pablo Escr​obarbe
Retour d'exil
Posté le 24-04-2007 à 17:47:24  profilanswer
 

bah je vois pas en quoi il faut être autiste pour faire sa regexp, c'est tout :o

n°1548306
MagicBuzz
Posté le 24-04-2007 à 17:48:40  profilanswer
 

pour faire "sa" regexp non, pour faire des regexp en général.
mais si tu sais écrire des regexp, tu peux pas comprendre :o

n°1548307
zecrazytux
Posté le 24-04-2007 à 17:51:46  profilanswer
 

les regex, cay le bien :)


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
n°1549115
simoes
Posté le 26-04-2007 à 08:56:58  profilanswer
 

mon problème est le suivant, j'ai un fichier xls que j'enregistre en csv.
Le problème c'est lorsque que dans une cellule j'ai un texte sur plusieurs lignes, dans mon fichier csv c'est pareil il me fait des retour à la ligne et le traitement n'est pas possible correctement avec php.
 
il faudrait que chaque ligne reste sur une ligne et pas sur plusieurs

n°1549275
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-04-2007 à 10:25:57  profilanswer
 

Ptain mais au lieu d'hurler que les regexs "cay le bien" y'en a pas un pour l'aider /FOU/ /FOU/ ???
 
Les regexs dans ce cas là c'est vraiment pas le plus simple. Je pense que tu aurais plus vite fait de faire un str_replace sur la sous-chaine entre les deux quotes
 
Si tu tiens vraiment a faire une regex, dans ton cas précis tu ferais mieux de prendre le problème à "l'envers".
C'est à dire remplacer tous les retours à la ligne qui ne marquent pas la fin d'une ligne dans ton fichier csv. Donc annuler tous les retours à la ligne qui ne suivent pas un ;.
Auquel cas la regex devient relativement simple, à condition de savoir se servir des assertions ( arrière négative dans ce cas précis):

Code :
  1. /(?<!;)[\r\n]//g


 
ps pour MagicBuzz, petitpois2, zecrazytux> avant de dire que c'est facile ou qu'il suffit de lire un tuto, essayez donc de la faire ...  
et pour finir une quote Masklinn staïlle:

Citation :

Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.

n°1549317
MagicBuzz
Posté le 26-04-2007 à 11:11:19  profilanswer
 

anapajari a écrit :

Ptain mais au lieu d'hurler que les regexs "cay le bien" y'en a pas un pour l'aider /FOU/ /FOU/ ???


On n'y peux rien si on n'est pas autistes nous :o
 

anapajari a écrit :

Les regexs dans ce cas là c'est vraiment pas le plus simple. Je pense que tu aurais plus vite fait de faire un str_replace sur la sous-chaine entre les deux quotes


Absolument pas d'accord, un str_replace va t'obliger à faire une usine à gaz selon moi
 

anapajari a écrit :

Si tu tiens vraiment a faire une regex, dans ton cas précis tu ferais mieux de prendre le problème à "l'envers".
C'est à dire remplacer tous les retours à la ligne qui ne marquent pas la fin d'une ligne dans ton fichier csv. Donc annuler tous les retours à la ligne qui ne suivent pas un ;.


Faux, un CSV, déjà utilise "," et non ";" et aucune ligne ne se termine par ";" (ou "," ) s'il est écrit convenablement. En tout cas, Excel n'en met pas.
 

anapajari a écrit :

Auquel cas la regex devient relativement simple, à condition de savoir se servir des assertions ( arrière négative dans ce cas précis):

Code :
  1. /(?<!;)[\r\n]//g



Je pige rien à ta regexp. Mais c'est pas ça du tout à quoi je pensais. Bon, vais faire un tour dans une doc sur les regexp pour pondre ce que je testerais. Je compte sur toi pour l'aider à la débuguer ensuite :spamafote:
 

anapajari a écrit :

ps pour MagicBuzz, petitpois2, zecrazytux> avant de dire que c'est facile ou qu'il suffit de lire un tuto, essayez donc de la faire ...  
et pour finir une quote Masklinn staïlle:

Citation :

Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.



Ben quoi ? T'aime pas les challenges ?

n°1549332
zecrazytux
Posté le 26-04-2007 à 11:18:52  profilanswer
 

Citation :


The basic rules are as follows:
 
CSV is a delimited data format that has fields/columns separated by the comma character and records/rows separated by newlines. Fields that contain a special character ( comma, newline, or double quote ), must be enclosed in double quotes. However, if a line contains a single entry which is the empty string, it may be enclosed in double quotes. If a field's value contains a double quote character it is escaped by placing another double quote character next to it. The CSV file format does not require a specific character encoding, byte order, or line terminator format.
 


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
n°1549368
Pablo Escr​obarbe
Retour d'exil
Posté le 26-04-2007 à 11:24:37  profilanswer
 

Ouais bah on pouvait pas lui faire sa regex vu qu'il donnait pas ce qu'il voulait :o
Maintenant qu'il l'a dit je vois pas trop parce que je suis une merdasse [:dawa]

n°1549375
MagicBuzz
Posté le 26-04-2007 à 11:27:22  profilanswer
 

[^|,|"]"[^"]?*([\r\n])[^"]?*"[,|$,|"]
 
=> Tout ce dont je suis sûr, c'est que ça marche pas :D
 
Le but du jeu, c'est d'isoler une sous-chaîne entre doubles quotes lorsque les doubles quotes commencent immédiatement après un début de ligne ou une virgule, et terminent immédiagement avant une fin de ligne ou une virgule.
Et il ne faut pas que cette sous-chaîne contienne de doubles quotes...
Et enfin, il faut que cette sous-chaîne contienne un retour à la ligne, qu'on met entre () afin de l'isoler pur itiliser la fonction reg_replece()
 
:spamafote:

Message cité 2 fois
Message édité par MagicBuzz le 26-04-2007 à 11:42:33
n°1549386
MagicBuzz
Posté le 26-04-2007 à 11:31:48  profilanswer
 

Pablo Escrobarbe a écrit :

Ouais bah on pouvait pas lui faire sa regex vu qu'il donnait pas ce qu'il voulait :o
Maintenant qu'il l'a dit je vois pas trop parce que je suis une merdasse [:dawa]


En tout cas, pour moi, quelqu'un qui sait écrire une regexp (donc pas moi [:magicbuzz] ) c'est extrêment "simple" à faire.
Par contre, le faire à la main, ça nécessite une lecture caractère par caractère, en faisant gaffe à l'encoding, faire une pile pour compter les " et les , etc. etc. plus le respect d'un algo imbittable que je viens de décrire dans mon précédent poste.
C'est le genre d'usines à gaz typiques que les regexp sont là pour éviter.


Message édité par MagicBuzz le 26-04-2007 à 11:33:04
n°1549390
zecrazytux
Posté le 26-04-2007 à 11:33:00  profilanswer
 

le probleme du caractere spécial c'est par exemple la virgule, danc ce cas t'es ouned: comment tu repere une virgule non voulue, d'une virgule propre au format CSV ?


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
n°1549398
MagicBuzz
Posté le 26-04-2007 à 11:35:03  profilanswer
 

zecrazytux a écrit :

le probleme du caractere spécial c'est par exemple la virgule, danc ce cas t'es ouned: comment tu repere une virgule non voulue, d'une virgule propre au format CSV ?


Parceque entre mes " " " je prends n'importe quel caractère sauf " " ", donc si y'a des virgules, "logiquement" ma regexp foireuse ne la prends pas en compte. Après, vu qu'elle est mal écrite, elle la prends peut-être en compte, mais c'est pas censé être le cas :D
 
En tout cas, c'est bien pour ça que je dis que c'est la merde à gérer avec une lecture à la main du fichier : y'a plein de petits cas à la con qui sont chiants à coder (alors qu'en regexp, t'ajoutes 3 pauvres caractères à ta ligne d'autiste et ça marche !)


Message édité par MagicBuzz le 26-04-2007 à 11:35:28
n°1549428
soju
One shot !
Posté le 26-04-2007 à 11:38:19  profilanswer
 

MagicBuzz a écrit :

Le but du jeu, c'est d'isoler une sous-chaîne entre doubles quotes lorsque les doubles quotes commencent immédiatement après un début de ligne ou une virgule, et terminent immédiagement avant une fin de ligne ou une virgule.
Et il ne faut pas que cette sous-chaîne contienne de doubles quotes...

presque, sauf que : "bla bla \" bla bla" => quote à l'intérieur de quote
=> donc je dirais chercher les bouts entre des quotes non précédées d'anti slash (assertion arrière négative), puis un callback (option e) str_replace
 
aller les gars, ça vous fera bosser les regexp  ;)  

n°1549435
MagicBuzz
Posté le 26-04-2007 à 11:39:42  profilanswer
 

soju a écrit :

presque, sauf que : "bla bla \" bla bla" => quote à l'intérieur de quote
=> donc je dirais chercher les bouts entre des quotes non précédées d'anti slash (assertion arrière négative), puis un callback (option e) str_replace
 
aller les gars, ça vous fera bosser les regexp  ;)


nan, en CSV on utilise "" au lieu de \"
=> l'équilibre est tout bête à contrôler : une sous-chaine est délimitée par ^" ," "" et "$ ", "" (au choix une des trois séquances à chaque fois)
C'est logiquement ce que je teste dans ma regexp mais à mon avis c'est mal écrit ;)

Message cité 1 fois
Message édité par MagicBuzz le 26-04-2007 à 11:41:12
n°1549442
MagicBuzz
Posté le 26-04-2007 à 11:42:47  profilanswer
 

en fait, je viens de corriger et ça me semble déjà mieux là :)

n°1549447
soju
One shot !
Posté le 26-04-2007 à 11:44:19  profilanswer
 

MagicBuzz a écrit :

nan, en CSV on utilise "" au lieu de \"

je rectifie : nan, en CSV version excel on utilise "" au lieu de \"  ;)  
Il n'y a aucune norme csv, et même si il en avait une, excel ne la respecterait sûrement pas...
 
sinon c'est presque pareil : quotes non précédées de quote

n°1549454
MagicBuzz
Posté le 26-04-2007 à 11:48:01  profilanswer
 

En fait, c'est ça, c'est mon dernier mot.
Une chaîne de caractères qui contient des séquences spéciales en CSV c'est :
 
Commence par le caractère " précédé soit d'un début de ligne, d'une virgule ou d'un caractère ".
Suivit d'une séquence de zéro ou plus caractères autres que ".
Terminé par le caractère " suivit soit d'une fin de ligne, d'une virgule ou d'un caractère ".
 
 
Cas spécifique de ,"", (chaine vide) : ça marche
 
Cas spécifique d'une virgule noyée dans une chaîne : ,"azaz,", : ça marche quelle que soit la position de la ,
 
Cas spécifique d'un sauf de ligne noyé dans une chaîne : ," zerer\nssd", : ça marche aussi
le seul point qui peut être gênant, c'est ça :
 
"ssdsd"","",""ssdsd"
=> là très franchement je sais pas si ma regexp s'en sort :D


Message édité par MagicBuzz le 26-04-2007 à 11:51:42
n°1549461
MagicBuzz
Posté le 26-04-2007 à 11:49:22  profilanswer
 

zecrazytux a écrit :

Citation :


The basic rules are as follows:
 
CSV is a delimited data format that has fields/columns separated by the comma character and records/rows separated by newlines. Fields that contain a special character ( comma, newline, or double quote ), must be enclosed in double quotes. However, if a line contains a single entry which is the empty string, it may be enclosed in double quotes. If a field's value contains a double quote character it is escaped by placing another double quote character next to it. The CSV file format does not require a specific character encoding, byte order, or line terminator format.
 



Bourdel :o
C'est quoi cette manie de toujours vouloir tous échapper à la sauce ANSI en dépit des règles imposées par une règle choisie ? :o
Je sais pas d'où il a sorti cette doc, mais très certainement pas de la doc d'Excel...
 
(ceci dit, ça change pas grand chose aux tests effectivement, ça le rends juste 10 fois plus long à écrire : l'échappement ANSI est une merde sans nom à matcher par regexp) -tout comme regexp est une merde sans nom à utiliser avec un langage qui respecte ANSI, puisqu'ils ont les mêmes caractères d'échappement...-


Message édité par MagicBuzz le 26-04-2007 à 11:53:14
n°1549466
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-04-2007 à 11:53:28  profilanswer
 

MagicBuzz a écrit :

[^|,|[""]]?[^"]?*"[^"]?*([\r\n])[^"]?*"[,|$,|[""]]?
=> Tout ce dont je suis sûr, c'est que ça marche pas :D
Le but du jeu, c'est d'isoler une sous-chaîne entre doubles quotes lorsque les doubles quotes commencent immédiatement après un début de ligne ou une virgule, et terminent immédiagement avant une fin de ligne ou une virgule.
Et il ne faut pas que cette sous-chaîne contienne de doubles quotes...
Et enfin, il faut que cette sous-chaîne contienne un retour à la ligne, qu'on met entre () afin de l'isoler pur itiliser la fonction reg_replece()
:spamafote:


ça s'écrirait comme ça plus simplement

Code :
  1. /"(.*?)[\n\r](.*?)"/$1$2/gs


Mais ça marche que s'il n'y a qu'un seul saut de ligne entre quotes ( le problème que j'évoquais plus haut) car dans ce cas précis l'option g est "annulée" par la s.
Du coup en toute théorie faudrait faire des sous-groupes:

Code :
  1. /"((.*?)[\r\n](.*?)*)"/


mais la c'est plus possible d'utiliser les $ pour faire le replace ... donc on oublie

 

D'ou mon idée de dire, on remplace tous les espaces sauf ceux qui marquent réellement une fin de ligne.
Pour le format csv, je pensais que ça se terminait pas un ";" ( ou "," pour les extremistes, la n'était pas le point important).
Mais le fait qu'il n'y en ai pas, c'est pas plus mal. On va faire une regex qui remplace tous les retours à la ligne suivi d'un texte contenant un ";":

Code :
  1. /[\r\n](?!.*?;)/


Sans voir son fichier difficile de dire, mais ça devrait fonctionner pas trop mal
edit: j'ai encore utilisé un ";" , il faut le remplacer par ","

 
MagicBuzz a écrit :

En tout cas, pour moi, quelqu'un qui sait écrire une regexp (donc pas moi [:magicbuzz] ) c'est extrêment "simple" à faire.


sir, no, sir.
Des regex j'en bouffe depuis que je fais du perl. Et je te garantis que celle-ci n'est pas simple ( en tout cas pour moi).
Pour toute te dire, si j'avais ça a faire je le ferais en deux fois:
- un capture de tous les textes entre quotes qui contiennent au moins un espace
- boucle pour remplacer tous ces espaces dans chaque item trouver

 


Message édité par anapajari le 26-04-2007 à 11:56:52
n°1549500
MagicBuzz
Posté le 26-04-2007 à 12:07:49  profilanswer
 

! <= ça veut dire quoi ?
 
moi j'ai utilisé ça pour avoir la liste des caractères, et je le trouve pas :D
 
http://en.wikipedia.org/wiki/Regular_expression
 
Sinon, je suis pas sûr que tes expression marchent bien.
 

Citation :

On va faire une regex qui remplace tous les retours à la ligne suivi d'un texte contenant un ";"


=> Ca, tout seul, ça peut pas marcher !
 
"titi","va","à
",la","piscine"
"toto","va","à","la","plage"
 
=> Bah ici, le premier sauf de ligne, ça marche...
Mais le seconde (après "piscine" ), le saut de ligne est effectivement suivit par des "," alors qu'on ne veut surtout pas l'échapper.
 
D'où mes tests plus évolués : [^|,|"]"[^"]?*([\r\n])[^"]?*"[,|$,|"]
=> il faut s'assurer que le saut de ligne trouvé est bien à l'intérieur d'une chaîne
 
Par contre, effectivement, il faut faire un replace récursif au cas où il y ait plusieurs retours à la ligne dans une même chaîne.

n°1549512
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-04-2007 à 12:30:41  profilanswer
 

MagicBuzz a écrit :

! <= ça veut dire quoi ?
moi j'ai utilisé ça pour avoir la liste des caractères, et je le trouve pas :D
http://en.wikipedia.org/wiki/Regular_expression


C'est une assertion négative, la doc de perl est assez bien faite à ce sujet si tu veux jeter un oeil:

Citation :

(?!pattern)
    A zero-width negative lookahead assertion. For example /foo(?!bar)/ matches any occurrence of ``foo'' that isn't followed by ``bar''. Note however that lookahead and lookbehind are NOT the same thing. You cannot use this for lookbehind.

 
MagicBuzz a écrit :


=> Ca, tout seul, ça peut pas marcher !
"titi","va","à
",la","piscine"
"toto","va","à","la","plage"
=> Bah ici, le premier sauf de ligne, ça marche...
Mais le seconde (après "piscine" ), le saut de ligne est effectivement suivit par des "," alors qu'on ne veut surtout pas l'échapper.


t'as pas tort patator ...

 


MagicBuzz a écrit :

D'où mes tests plus évolués : [^|,|"]"[^"]?*([\r\n])[^"]?*"[,|$,|"]
=> il faut s'assurer que le saut de ligne trouvé est bien à l'intérieur d'une chaîne


c'est tout caca ton truc ;)

  • il faut backslasher le ^ dans les crochets sinon tu lui indiques que tu définis le motif contraire
  • les pipes sont inutiles dans les crochets
  • tu peux te servir du point d'intérrogation pour rendre tes patterns non-greedy et ainsi éviter de jouer avec des [^"]

j'aurais tendance à le réécrire comme ça:

Code :
  1. /[\r\n](([^,]*?)([\r\n])|",)/$1/gs


ça marcouille dans le cas simples ( ton exemple) mais s'il y a bcp de retour à la ligne ça merdouille:

Code :
  1. #! /usr/bin/perl
  2. use strict;
  3. my $a = '"titi","va","à
  4. ",la","piscine
  5. avec
  6. ces
  7. amis"
  8. "toto","va","à","la","plage" ';
  9. $a =~ s/[\r\n](([^,]*?)([\r\n])|",)/$1/sg;
  10. print $a;

donne

"titi","va","à",la","piscine avec
ces amis"
"toto","va","à","la","plage"

 
MagicBuzz a écrit :

Par contre, effectivement, il faut faire un replace récursif au cas où il y ait plusieurs retours à la ligne dans une même chaîne.


Zouper [:dawak], et après on parle d'usine à gaz avec str_replace !

 


Message édité par anapajari le 26-04-2007 à 12:32:13
n°1549605
MagicBuzz
Posté le 26-04-2007 à 12:58:35  profilanswer
 

ben si le moteur regexp est bien foutu, il ne fait l'appel que sur la sous-chaîne traîtée, et uniquement si il a déjà trouvé une occurence dans la sous-chaine, on peut pas dire que ce soit la mort :o (pour ça que je parle de "récursif" et non de "successif" ;))

Message cité 1 fois
Message édité par MagicBuzz le 26-04-2007 à 12:58:50
n°1549609
MagicBuzz
Posté le 26-04-2007 à 13:00:46  profilanswer
 

sinon, je pige toujours pas ta regexp :D
 
"littéralement", elle fait quoi ?
 
sinon, la mienne corrigée du coup :

Code :
  1. [\^,"]"[^"]?*([\r\n])[^"]?*"[\$,"]

n°1549722
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-04-2007 à 13:54:14  profilanswer
 

MagicBuzz a écrit :

ben si le moteur regexp est bien foutu, il ne fait l'appel que sur la sous-chaîne traîtée, et uniquement si il a déjà trouvé une occurence dans la sous-chaine, on peut pas dire que ce soit la mort :o (pour ça que je parle de "récursif" et non de "successif" ;))


Nan mais ça marche pas comme ça hein ;)
Reprenons ton exemple modifé:

#
"titi","va","à
",la","piscine
avec
ces
amis"
"toto","va","à","la","plage" '


Sur la chaine "piscine ... amis"
le moteur va matcher "(piscine \n avec) puis ( ces \n amis) mais pas (avec \n ces) car les deux morceaux qui composent ce truc ont déjà été matchés.

 
MagicBuzz a écrit :

sinon, je pige toujours pas ta regexp :D


laquelle? celle la:

/[\r\n](?!.*?;)/


un retour à la ligne non suivi de "un texte suivi d'un point virgule"
celle la:

/[\r\n](([^,]*?)([\r\n])|",)/$1/gs


un retour à la ligne suivi d'un texte suivi d'un retour à la ligne ou de l'expression ",
on remplace tout ça par le contenu de la 1ere parenthèse capturence $1

 
MagicBuzz a écrit :


sinon, la mienne corrigée du coup :

Code :
  1. [\^,"]"[^"]?*([\r\n])[^"]?*"[\$,"]



t'as toujours le problème quand il y a plusieurs retours à la ligne.
edit: et elle marche pas du tout ;)

Code :
  1. #! /usr/bin/perl
  2. use strict;
  3. my $a = '"titi","va","à
  4. ",la","piscine
  5. avec
  6. ces
  7. amis"
  8. "toto","va","à","la","plage" ';
  9. $a =~ s/[\^,"]"[^"]*?([\r\n])[^"]*?"[\$,"]/$1/sg;
  10. print $a;


donne (une fois corrigé l'inversion des * ? )

"titi","va"
la","piscine
avec
ces
amis"
"toto","va","à","la","plage"

  


Message édité par anapajari le 26-04-2007 à 14:00:10
n°1549785
simoes
Posté le 26-04-2007 à 14:28:01  profilanswer
 

bon apparement pas tout le monde à compris mon problème je vais mettre un cas pratique :
 
6067;19.04.2007;20.04.2007;Workshop;Workshop;Lieu;Tous;320;;;;;NM;VD
7026;20.04.2007;20.04.2007;Colf Coaching ;"Golf Coaching Discover
14h00-18h00";Lieu;AP;190;;;;;AB;VD
 
la première ligne est correcte (pas de retour à la ligne)
la deuxième est sur deux lignes mais la valeur sur 2 lignes est entourées de "
 
voila j'éspère que c'est plus clair...
 
(les regexp j'ai beau essayé, j'arrive pas...
 
il faut remplacer tout les \n qui se trouve entre deux "
 
merci

n°1549790
MagicBuzz
Posté le 26-04-2007 à 14:30:46  profilanswer
 

Ca ça marche chez moi :

Code :
  1. Option Explicit
  2.  
  3. Dim str, reg
  4.  
  5. str = """titi"",""va"",""à"",""la" & vbCrLf & _
  6.      """,""piscine avec ces """"amis""""" & vbcrlf & _
  7.      """toto"",""va"",""à"",""la"",""plage""" & vbcrlf & _
  8.      """tr" & vbcrlf & vbcrlf & _
  9.      "uc"", ""va"", ""à"", """ & vbcrlf & _
  10.      "la"", ""rivière"""
  11.  
  12. msgbox(str)
  13.  
  14. Set reg = new RegExp
  15.  
  16. reg.pattern = "([\^,""]""[^""]*)\r\n([^""\r\n]*""[\$,""])"
  17. reg.Global = True
  18. str = reg.Replace(str, "$1<br/>$2" )
  19.  
  20. msgbox(str)


 
En fait, ça pmarche, sauf que marche qu'avec la première occurence :heink:
Même si je le lance de façon successive ensuite, il ne prends pas en compte la suite :heink:

Message cité 2 fois
Message édité par MagicBuzz le 26-04-2007 à 14:36:28
n°1549801
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-04-2007 à 14:34:43  profilanswer
 

simoes a écrit :

6067;19.04.2007;20.04.2007;Workshop;Workshop;Lieu;Tous;320;;;;;NM;VD
7026;20.04.2007;20.04.2007;Colf Coaching ;"Golf Coaching Discover
14h00-18h00";Lieu;AP;190;;;;;AB;VD


Toutes les lignes "normales" se finissent pas VD? Ou par une liste de valeurs finie?

 
MagicBuzz a écrit :

Ca ça marche chez moi : (en cours de correction en fait, ça marche pas :D

Code :
  1. Option Explicit
  2. Dim str, str2, reg
  3. str = """titi"",""va"",""à"",""la" & vbCrLf & _
  4.      """,""piscine avec ces """"amis""""" & vbcrlf & _
  5.      """toto"",""va"",""à"",""la"",""plage"""
  6. msgbox(str)
  7. Set reg = new RegExp
  8. 'reg.Pattern = "[\^,""]""[^""]*([\r\n])[^""]*""[\$,""]"
  9. reg.pattern = "([\^,""]""[^""]*)\r\n([^""\r\n]*""[\$,""])"
  10. reg.Global = True
  11. str2 = reg.Replace(str, "$1<br/>$2" )
  12. msgbox(str2)



A vue de nez je dirais que le moteur de regex sur ton truc ça doit être POSIX et pas PCRE, du coup si (ça marche ;) et)  il eut s'en servir en php il faut utiliser ereg_* et pas preg_*

Message cité 2 fois
Message édité par anapajari le 26-04-2007 à 14:35:25
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [php] Remplace tout les \n entre "" dans une chaine

 

Sujets relatifs
Comparaison de Chaine de caractères, déplacement DOMRajouter des éléments à l’aide de chaine de caractère
[vbs] [SOLVED!!] Simple remplacement de chaine...[Win32]GetTextExtentPoint32 ne me donne pas la bonne largeur de chaîne
[c] liste simplement chainé==> pb [résolu==> merci]Faire un substring d'une chaine de caractères larges
Tester le format d'une chaine & expressions régulieres[Résolu] Remplacement d'une chaine par <BR/>
[JS] Exécuter une fonction à partir de son nom en variable chaîne[SQL] Remplacé une chaîne dans X champs
Plus de sujets relatifs à : [php] Remplace tout les \n entre "" dans une chaine


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR