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

Poser une question


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/
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
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."
oui c'est une idée...
si j'arrive pas a le faire en un coup je ferai sans doute ca...
merci
Etienne
ouimainon : avec "ligne 1;c'est super!;ligne 2", on obtient :
[0] => ligne 1
[1] => c
[2] => est super!
[3] => ligne 2
même joueur, essaye encore :)
a+
--
P'tit Marcel
mais pourquoi avoir un reply-to: identique au from: ???