Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/03/2007, 17h15   #1
Invité de passage
 
Étudiant
Inscription : mai 2006
Messages : 7
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2006
Messages : 7
Points : 3
Points : 3
Par défaut supprimer une partie d'une chaine ..

Bonjour,
voici mon problème, j'aimerais supprimer dans une chaine de caractère la sous chaine comprise entre le 5ème et le 6ème guillemet.

Exemple : ma chaine --> blablabla "blablabla" "blablabla" "blablaAEffacer" blablabla blablabla ... <--

Puis j'aimerais que ma chaine s'affiche après traitement comme cela : --> blablabla "blablabla" "blablabla" "" blablabla blablabla ... <--


Je pense qu'une expression régulière pourrait me permettre de réaliser cela mais je n'en suis pas sur car je n'y connais rien du tout en regexp ...

Merci d'avance pour vos réponses.
zespoofiz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2007, 18h17   #2
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
Code :
echo preg_replace('/((".*?"(\s+)){2})(?2)/', '\1""\3', $str);
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2007, 09h50   #3
Invité de passage
 
Étudiant
Inscription : mai 2006
Messages : 7
Détails du profil
Informations personnelles :
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2006
Messages : 7
Points : 3
Points : 3
Merci pour ta réponse.

Pourrais-tu m'expliquer le fonctionnement de cette expression ?
J'aimerais comprendre et apprendre afin de les réaliser par moi même les prochaines fois.
La seule chose que je comprend c'est que la fonction preg_replace remplace '/((".*?"(\s+)){2})(?2)/' par '\1""\3' dans la chaine $str ...


Sinon le resultat n'est pas tout a fait celui attendu mais c'est de ma faute car je ne l'ai pas précisé dans mon premier post.
En effet cela fonctionne avec :
Code :
$str="blabladivers1 \"blabla divers2\" \"blabla divers3\" \"blabla a effacer\" blabla divers4 \"blabla divers5\" etc ";
Mais s'il ya quelque chose (du texte qui n'est pas entre guillemet) entre \"blabla divers3\" et \"blabla a effacer\"
Code :
$str="blabladivers1 \"blabla divers2\" \"blabla divers3\" blablaentre  \"blabla a effacer\" blabla divers4 \"blabla divers5\" etc ";
, cela ne marche pas.

C'est pour cela que je voudrais vraiment remplacer ce qui se trouve précisemment entre le 5ème et le 6ème guillemet par du vide ('\1""\3' dans la regexp) .



Pour info, j'arrive a faire ce que je veux mais d'une facon qui n'est peut être pas très propre ... enfin je n'ai pas le choix je ne connais pas du tout les expressions regulières pour le moment.

Voila ce que je fais :

Code :
1
2
3
$tab_tmp=explode('"', $str);
unset($tab_tmp[5]);
$str=implode('"', $tab_tmp);
zespoofiz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2007, 23h38   #4
Membre éprouvé
 
Avatar de goodpz
 
Inscription : février 2007
Messages : 475
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 475
Points : 474
Points : 474
La solution avec explode() est aussi bien. J'y ai pensé la première fois mais comme tu voulais un regex, j'ai posté un regex.

Voici un autre regex qui fonctionne pour ce que tu veux:

Code :
echo preg_replace('/(((".*?")((?!").)+){2})(?3)/', '\1""', $str);
Assez complexe je pense, et comme il se fait tard, je l'expliquerai demain ; )
goodpz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h10.


 
 
 
 
Partenaires

Hébergement Web