"Etienne SOBOLE" a écrit dans le message de news: 42c92698$0$31207$
j'aimerai couper une chaine chaque fois que je tombe sur un ; sauf quand de ; est dans une chaine !!!
exemple: ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;' plus compliqué;une dernière
devrait donner ligne 1 ligne qui porte le nom 'paul' un autre nom 'avec un ;' plus compliqué une dernière
Moi je pense qu'une boucle serait mieux:
function mySplit($string) { $string .= ';'; $res = array(); $start = 0; $insideString = false; for ($i=0; $i<strlen($string); $i++) { switch ($string{$i}) { case "'": case '"': $insideString = !$insideString; break; case ';': if(!$insideString) { $res[] = substr($string, $start, $i-$start); $start = $i+1; } break; } } return $res; }
print_r(mySplit("ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;' plus compliqué;une dernière"));
-- Vincent
Guillaume Bouchard
Etienne SOBOLE wrote:
j'aimerai couper une chaine chaque fois que je tombe sur un ; sauf quand de ; est dans une chaine !!!
J'ai traité un sujet dans le style il y a peu sur fclpython, on va adapté cela :
<?php $pattern = "`(?:[^;']|(?:'[^']*'))+`"; $str = "ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;' plus compliqué;une dernière"; preg_match_all($pattern,$str,$match); print_r($match); ?>
Normalement c'est bon. Je t'avoue que c'est du fait à l'arach sans trop réflechir... :) Sur l'exemple cela marche, cela ne veux pas dire que c'est parfait.
Message perso : Coucou P'tit Marcel :)
<mode ouiinn> J'aurais aimé le faire avec un split regex. Pas trop dur a condition que les assertion negative arrière prenent en compte les chaines de longueur indeterminé, ce qui n'est pas le cas apparament... Eu après reflexion, ça aurait planté de toute façon, donc on oublie. </mode>
-- Guillaume. "Les regex, c'est ma grande passion."
Etienne SOBOLE wrote:
j'aimerai couper une chaine chaque fois que je tombe sur un ; sauf quand de
; est dans une chaine !!!
J'ai traité un sujet dans le style il y a peu sur fclpython, on va
adapté cela :
<?php
$pattern = "`(?:[^;']|(?:'[^']*'))+`";
$str = "ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;' plus
compliqué;une dernière";
preg_match_all($pattern,$str,$match);
print_r($match);
?>
Normalement c'est bon. Je t'avoue que c'est du fait à l'arach sans trop
réflechir... :) Sur l'exemple cela marche, cela ne veux pas dire que
c'est parfait.
Message perso : Coucou P'tit Marcel :)
<mode ouiinn>
J'aurais aimé le faire avec un split regex. Pas trop dur a condition que
les assertion negative arrière prenent en compte les chaines de longueur
indeterminé, ce qui n'est pas le cas apparament... Eu après reflexion,
ça aurait planté de toute façon, donc on oublie.
</mode>
--
Guillaume.
"Les regex, c'est ma grande passion."
j'aimerai couper une chaine chaque fois que je tombe sur un ; sauf quand de ; est dans une chaine !!!
J'ai traité un sujet dans le style il y a peu sur fclpython, on va adapté cela :
<?php $pattern = "`(?:[^;']|(?:'[^']*'))+`"; $str = "ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;' plus compliqué;une dernière"; preg_match_all($pattern,$str,$match); print_r($match); ?>
Normalement c'est bon. Je t'avoue que c'est du fait à l'arach sans trop réflechir... :) Sur l'exemple cela marche, cela ne veux pas dire que c'est parfait.
Message perso : Coucou P'tit Marcel :)
<mode ouiinn> J'aurais aimé le faire avec un split regex. Pas trop dur a condition que les assertion negative arrière prenent en compte les chaines de longueur indeterminé, ce qui n'est pas le cas apparament... Eu après reflexion, ça aurait planté de toute façon, donc on oublie. </mode>
-- Guillaume. "Les regex, c'est ma grande passion."
Etienne SOBOLE
Moi, je m'orienterais vers une solution bovinante en 3 coups, genre : si $t = une séquence de caractère supposée impossible preg_replace de ; entre ' ou " par $t split classique avec ; preg_replace de $t par ; pour le tableau résultant du split
oui c'est une idée... si j'arrive pas a le faire en un coup je ferai sans doute ca...
merci Etienne
Moi, je m'orienterais vers une solution bovinante en 3 coups, genre :
si $t = une séquence de caractère supposée impossible
preg_replace de ; entre ' ou " par $t
split classique avec ;
preg_replace de $t par ; pour le tableau résultant du split
oui c'est une idée...
si j'arrive pas a le faire en un coup je ferai sans doute ca...
Moi, je m'orienterais vers une solution bovinante en 3 coups, genre : si $t = une séquence de caractère supposée impossible preg_replace de ; entre ' ou " par $t split classique avec ; preg_replace de $t par ; pour le tableau résultant du split
oui c'est une idée... si j'arrive pas a le faire en un coup je ferai sans doute ca...
merci Etienne
P'tit Marcel
Guillaume Bouchard wrote:
Etienne SOBOLE wrote:
j'aimerai couper une chaine chaque fois que je tombe sur un ; sauf quand de ; est dans une chaine !!!
J'ai traité un sujet dans le style il y a peu sur fclpython, on va adapté cela : <?php $pattern = "`(?:[^;']|(?:'[^']*'))+`"; $str = "ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;' plus compliqué;une dernière"; preg_match_all($pattern,$str,$match); print_r($match); ?>
Normalement c'est bon.
ouimainon : avec "ligne 1;c'est super!;ligne 2", on obtient : [0] => ligne 1 [1] => c [2] => est super! [3] => ligne 2
Message perso : Coucou P'tit Marcel :)
même joueur, essaye encore :)
a+ -- P'tit Marcel mais pourquoi avoir un reply-to: identique au from: ???
Guillaume Bouchard wrote:
Etienne SOBOLE wrote:
j'aimerai couper une chaine chaque fois que je tombe sur un ; sauf
quand de ; est dans une chaine !!!
J'ai traité un sujet dans le style il y a peu sur fclpython, on va
adapté cela :
<?php
$pattern = "`(?:[^;']|(?:'[^']*'))+`";
$str = "ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;' plus
compliqué;une dernière";
preg_match_all($pattern,$str,$match);
print_r($match);
?>
Normalement c'est bon.
ouimainon : avec "ligne 1;c'est super!;ligne 2", on obtient :
[0] => ligne 1
[1] => c
[2] => est super!
[3] => ligne 2
Message perso : Coucou P'tit Marcel :)
même joueur, essaye encore :)
a+
--
P'tit Marcel
mais pourquoi avoir un reply-to: identique au from: ???
j'aimerai couper une chaine chaque fois que je tombe sur un ; sauf quand de ; est dans une chaine !!!
J'ai traité un sujet dans le style il y a peu sur fclpython, on va adapté cela : <?php $pattern = "`(?:[^;']|(?:'[^']*'))+`"; $str = "ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;' plus compliqué;une dernière"; preg_match_all($pattern,$str,$match); print_r($match); ?>
Normalement c'est bon.
ouimainon : avec "ligne 1;c'est super!;ligne 2", on obtient : [0] => ligne 1 [1] => c [2] => est super! [3] => ligne 2
Message perso : Coucou P'tit Marcel :)
même joueur, essaye encore :)
a+ -- P'tit Marcel mais pourquoi avoir un reply-to: identique au from: ???
Etienne SOBOLE
J'ai traité un sujet dans le style il y a peu sur fclpython, on va adapté cela : $pattern = "`(?:[^;']|(?:'[^']*'))+`";
merci. j'avoue que la ca dépasse un peu ma compréhension des expression régulières... par contre, au risque d'etre chiant ;) je me permet de complexifier un poil le probleme...
ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;et un ' dans la chaine' plus compliqué;une dernière
en ajoutant un ' dans la chaine...
pour ma culture personnelle peux tu m'expliquer ce que recherche ?:[^;']
merci Etienne
PS : j'ai pas encore testé ton expression régulière mais je vias le faire ;)
J'ai traité un sujet dans le style il y a peu sur fclpython, on va adapté
cela :
$pattern = "`(?:[^;']|(?:'[^']*'))+`";
merci.
j'avoue que la ca dépasse un peu ma compréhension des expression
régulières...
par contre, au risque d'etre chiant ;) je me permet de complexifier un poil
le probleme...
ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;et un ' dans
la chaine' plus compliqué;une dernière
en ajoutant un ' dans la chaine...
pour ma culture personnelle peux tu m'expliquer ce que recherche
?:[^;']
merci
Etienne
PS : j'ai pas encore testé ton expression régulière mais je vias le faire ;)
J'ai traité un sujet dans le style il y a peu sur fclpython, on va adapté cela : $pattern = "`(?:[^;']|(?:'[^']*'))+`";
merci. j'avoue que la ca dépasse un peu ma compréhension des expression régulières... par contre, au risque d'etre chiant ;) je me permet de complexifier un poil le probleme...
ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;et un ' dans la chaine' plus compliqué;une dernière
en ajoutant un ' dans la chaine...
pour ma culture personnelle peux tu m'expliquer ce que recherche ?:[^;']
merci Etienne
PS : j'ai pas encore testé ton expression régulière mais je vias le faire ;)
Guillaume Bouchard
Etienne SOBOLE wrote:
merci.
De rien, surtout qu'il parait d'après P'tit Marcel que c'est inparfait...
j'avoue que la ca dépasse un peu ma compréhension des expression régulières...
Je t'avoue que je n'ose même pas relire.
par contre, au risque d'etre chiant ;) je me permet de complexifier un poil le probleme...
Non mais !
ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;et un ' dans la chaine' plus compliqué;une dernière
Dit moi, tu ne veux pas plus simplement faire un truc qui split sur les ; et qui ignore les ; si ils sont backslasher ?
pour ma culture personnelle peux tu m'expliquer ce que recherche ?:[^;']
[] -> groupe de caractères. Si commence par ^ c'est un groupe negatif: [^;'] -> tout ce qui n'est pas ; ou ' Puis (?:x) c'est un groupe non capturant. Cela permet d'alleger l'expression de sortie.
PS : j'ai pas encore testé ton expression régulière mais je vias le faire ;)
Ok.
-- Guillaume.
Etienne SOBOLE wrote:
merci.
De rien, surtout qu'il parait d'après P'tit Marcel que c'est inparfait...
j'avoue que la ca dépasse un peu ma compréhension des expression
régulières...
Je t'avoue que je n'ose même pas relire.
par contre, au risque d'etre chiant ;) je me permet de complexifier un poil
le probleme...
Non mais !
ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;et un ' dans
la chaine' plus compliqué;une dernière
Dit moi, tu ne veux pas plus simplement faire un truc qui split sur les
; et qui ignore les ; si ils sont backslasher ?
pour ma culture personnelle peux tu m'expliquer ce que recherche
?:[^;']
[] -> groupe de caractères. Si commence par ^ c'est un groupe negatif:
[^;'] -> tout ce qui n'est pas ; ou '
Puis (?:x) c'est un groupe non capturant. Cela permet d'alleger
l'expression de sortie.
PS : j'ai pas encore testé ton expression régulière mais je vias le faire ;)
De rien, surtout qu'il parait d'après P'tit Marcel que c'est inparfait...
j'avoue que la ca dépasse un peu ma compréhension des expression régulières...
Je t'avoue que je n'ose même pas relire.
par contre, au risque d'etre chiant ;) je me permet de complexifier un poil le probleme...
Non mais !
ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;et un ' dans la chaine' plus compliqué;une dernière
Dit moi, tu ne veux pas plus simplement faire un truc qui split sur les ; et qui ignore les ; si ils sont backslasher ?
pour ma culture personnelle peux tu m'expliquer ce que recherche ?:[^;']
[] -> groupe de caractères. Si commence par ^ c'est un groupe negatif: [^;'] -> tout ce qui n'est pas ; ou ' Puis (?:x) c'est un groupe non capturant. Cela permet d'alleger l'expression de sortie.
PS : j'ai pas encore testé ton expression régulière mais je vias le faire ;)
Ok.
-- Guillaume.
Guillaume Bouchard
P'tit Marcel wrote:
ouimainon : avec "ligne 1;c'est super!;ligne 2", on obtient : [0] => ligne 1 [1] => c [2] => est super! [3] => ligne 2
Pas précisé dans le cahier des charges... :)
Message perso : Coucou P'tit Marcel :)
même joueur, essaye encore :)
Et flute. Bon, je vais tacher d'amélioré cela.
-- Guillaume.
P'tit Marcel wrote:
ouimainon : avec "ligne 1;c'est super!;ligne 2", on obtient :
[0] => ligne 1
[1] => c
[2] => est super!
[3] => ligne 2
ouimainon : avec "ligne 1;c'est super!;ligne 2", on obtient : [0] => ligne 1 [1] => c [2] => est super! [3] => ligne 2
Pas précisé dans le cahier des charges... :)
Message perso : Coucou P'tit Marcel :)
même joueur, essaye encore :)
Et flute. Bon, je vais tacher d'amélioré cela.
-- Guillaume.
Etienne SOBOLE
ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;et un ' dans la chaine' plus compliqué;une dernière Dit moi, tu ne veux pas plus simplement faire un truc qui split sur les ;
et qui ignore les ; si ils sont backslasher ?
heu... si ca peut le faire aussi...
ceci dit, je sais pas plus comment faire l'expression regulière.... Etienne
ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;et un '
dans la chaine' plus compliqué;une dernière
Dit moi, tu ne veux pas plus simplement faire un truc qui split sur les ;
et qui ignore les ; si ils sont backslasher ?
heu...
si ca peut le faire aussi...
ceci dit, je sais pas plus comment faire l'expression regulière....
Etienne
ligne 1;ligne qui porte le nom 'paul';un autre nom 'avec un ;et un ' dans la chaine' plus compliqué;une dernière Dit moi, tu ne veux pas plus simplement faire un truc qui split sur les ;
et qui ignore les ; si ils sont backslasher ?
heu... si ca peut le faire aussi...
ceci dit, je sais pas plus comment faire l'expression regulière.... Etienne
Guillaume Bouchard
Etienne SOBOLE wrote:
Dit moi, tu ne veux pas plus simplement faire un truc qui split sur les ; et qui ignore les ; si ils sont backslasher ?
ceci dit, je sais pas plus comment faire l'expression regulière....
<?php $pattern = '`(?<!);`'; $str = 'haha la tarentule ; hihi ; avec des ; echapés (de la ; prison ?)'; $liste = preg_split($pattern,$str); print_r($liste); ?>
-- Guillaume.
Etienne SOBOLE wrote:
Dit moi, tu ne veux pas plus simplement faire un truc qui split sur les ;
et qui ignore les ; si ils sont backslasher ?
ceci dit, je sais pas plus comment faire l'expression regulière....
<?php
$pattern = '`(?<!\);`';
$str = 'haha la tarentule ; hihi ; avec des ; echapés (de la ; prison
?)';
$liste = preg_split($pattern,$str);
print_r($liste);
?>