Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

expression reguliere pour remplacer un split

10 réponses
Avatar
Etienne SOBOLE
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

c'est possible ca?
merci
Etienne

10 réponses

Avatar
P'tit Marcel
Etienne SOBOLE wrote:
j'aimerai couper une chaine chaque fois que je tombe sur un ; sauf quand de
; est dans une chaine !!!


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


mais il y a peut-être plus élégant, en un coup, avec des assertions
négatives...

--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/

Avatar
Vincent Lascaux
"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

Avatar
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."

Avatar
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

Avatar
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: ???


Avatar
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 ;)

Avatar
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.

Avatar
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.


Avatar
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


Avatar
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.