GNT sans publicité, site mobile, fonctionnalitées exclusives...

expression reguliere pour remplacer un split

Le
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
Lire les 10 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
P'tit Marcel
Le #801725
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/

Vincent Lascaux
Le #801723
"Etienne SOBOLE" 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
Le #801719
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
Le #801519
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
Le #801521
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: ???


Publicité
Suivre les réponses
Poster une réponse
Anonyme