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 03/02/2008, 13h36   #1
Futur Membre du Club
 
Inscription : janvier 2008
Messages : 63
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 63
Points : 16
Points : 16
Par défaut Remplacer quelque chose entre 2 noms

Bonjour tout le monde,
J'ai un petit problème, j'aimerais remplacer quelque chose par quelque chose d'autre, voici un exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
//on repère d'abord si[liste],[/liste], [puce] et [/puce] 
//sont présents dans la signature
if(preg_match("/[liste]/", $signature) 
AND preg_match("/[\/liste]/", $signature) 
AND preg_match("/[puce]/", $signature) 
AND preg_match("/[\/puce]/", $signature)) {
$signature = str_replace('[ code]', '<div class="erreur">Code non autorisé', $signature);
$signature = str_replace('[/ code]', '</div>',$signature);
}
else {
$signature = str_replace('[ code]', '<div class="code">', $signature);
$signature = str_replace('[/ code]', '</div>',$signature);
}
Ce bout de code marche bien mais il y a un petit problème,
c'est que si la personne utilise [ code] [ /code] en ayant auparavant ou par après utilisé [ liste] [ /liste], il sera marqué "code non autorisé"
pour la zone d'affichage du code.
J'aimerais donc, grâce à une regex, savoir si on se trouve entre [ liste] [ /liste] et ne pas autoriser le code
sinon, si on ne se trouve pas entre [ liste] [ /liste]
on autorise l'affichage du code.
Je remercie celle/celui qui m'aidera.
beji15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2008, 20h52   #2
Futur Membre du Club
 
Inscription : janvier 2008
Messages : 63
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 63
Points : 16
Points : 16
En fait, ce qu'il faudrait faire ( et que je ne sais pas faire),

c'est de récupérer le message entre [ liste] [ /liste] et remplacer [ code] [ /code] par

<div class="erreur">Code non autorisé</div>

Donc, il faut juste que je puisse récupérer le message situé entre [ liste] [ /liste]

pour effectuer des opérations
beji15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2008, 01h51   #3
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Code :
!\[liste\](.*?)\[/liste\]!i
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 04h56   #4
Futur Membre du Club
 
Inscription : janvier 2008
Messages : 63
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 63
Points : 16
Points : 16
merci Antoun
mais je fais comment pour exploiter ceci ?
une petite précision m'aiderait
beji15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 08h39   #5
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
dans les regex, les parenthèses sont capturantes, càd qu'elles permettent de récupérer le texte qu'elles ont reconnu. Ce texte sera numéroté : $1 représente la capture de la première paire de parenthèses, $2 celle de la deuxième, etc.

Code :
1
2
3
4
 
$matches = array() ;
preg_match($masque, $texte, $matches) ;
echo $matches[1] ;
$matches est le tableau de matches : son élément 0 contient le texte "matché" par l'ensemble du masque, l'élément 1 contient $1, etc.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 18h45   #6
Futur Membre du Club
 
Inscription : janvier 2008
Messages : 63
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 63
Points : 16
Points : 16
J'ai essayé ce que tu m'as indiqué Antoun mais je ne comprends toujours pas
J'ai essayé ceci :
Code :
1
2
3
4
5
6
7
 
if(preg_match("/[liste]/", $signature) 
AND preg_match("/[\/liste]/", $signature) 
AND preg_match("/[puce]/", $signature) 
AND preg_match("/[\/puce]/", $signature)) {
 
$signature = str_replace(!\[liste\](.*?)\[/liste\]!i, '$1', '<div class="erreur">code non autorisé</div>',$signature)
mais ça fonctionne pas
mais j'ai plutôt l'impression que c'est moi qui me trompe

Edit : [HORS SUJET] Je suis confronté à un problème tellement facile mais que je n'arrive pas à résoudre.
Le voici :
Code :
1
2
 
mysql_query("DELETE FROM commentaires WHERE id_news='$id_news'");
Cette requête, normalement censée supprimer les commentaires d'une news précise, ne supprime rien du tout ! Et la requête suivante s'éxécute convenablement.
Code :
1
2
 
$delete = mysql_query("DELETE FROM news WHERE id='$id_news'");
Est - ce normal ? [/HORS SUJET]
beji15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 20h07   #7
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
Bonjour,

Si tu utilise une expression régulière, alors il faut utiliser preg_replace et non str_replace

Pour ton pb de delete, si id_news est un entier ( int, bigint,etc...) alors il ne faut pas mettre de cote.
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 20h29   #8
Futur Membre du Club
 
Inscription : janvier 2008
Messages : 63
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 63
Points : 16
Points : 16
Merci FCYPBA de ta réponse,
mais comment puis - je utiliser preg_replace dans mon cas ?
Je n'ai jamais utilisé les expressions régulières pour quoi que ce soit auparavant.
Alors je me sens perdu

Edit : le problème avec le DELETE venait d'une condition. Maintenant, il fonctionne mais le problème avec [ liste] et[/liste] persiste
beji15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 23h14   #9
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
En fait je répondais à ça :
Citation:
Envoyé par beji15 Voir le message
Donc, il faut juste que je puisse récupérer le message situé entre [ liste] [ /liste]
Je recolle un peu les morceaux :

Code :
1
2
3
4
5
$masque = '!\[liste\](.*?)\[/liste\]!i' ;
$matches = array() ;
if (preg_match($masque, $signature, $matches) ) {
  $contenu_extrait = $matches[1] ;
}
Néanmoins, cela ne correspond pas à ce que tu veux puisque tu veux remplacer et pas "juste récupérer" (avec les lecteurs distraits comme moi, il faut éviter de changer d'avis d'une phrase sur l'autre, parce qu'on ne retient que la dernière).
... (à suivre)
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2008, 23h31   #10
Futur Membre du Club
 
Inscription : janvier 2008
Messages : 63
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 63
Points : 16
Points : 16
Merci Antoun, j'obtiens le message situé entre[liste] et[/liste]
mais...une dernière question, en faisant ton code :
Code :
1
2
3
4
5
6
 
$masque = '!\[liste\](.*?)\[/liste\]!i' ;
$matches = array() ;
if (preg_match($masque, $signature, $matches) ) {
  $contenu_extrait = $matches[1] ;
}
Si j'ajoute ceci au code, cela ne fonctionnerait pas ? :
Code :
1
2
3
4
5
6
7
8
 
$masque = '!\[liste\](.*?)\[/liste\]!i' ;
$matches = array() ;
if (preg_match($masque, $signature, $matches) ) 
{
$signature = str_replace('[ code]', '<div class="erreur">Code non autorisé', $signature);
$signature = str_replace('[/ code]', '</div>',$signature);
}
???????????????????
beji15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 00h20   #11
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Non, ça ne marcherait pas, ou plus exactement ça marcherait trop bien. Supposons que tu aies ça comme $signature :
Citation:
[CODE]echo "hello world !";[/CODE][LISTE]évitez le [CODE]format c:[/CODE][/LISTE]
Si jai bien compris, tu veux interdire format c: et autoriser echo. Avec ton code, la regex matcherait le format ; du coup, toutes les balises [CODE][/CODE]seraient remplacées, y compris [I]echo[/I]..

(au passage, pour pouvoir écrire [CODE] et [/CODE], il faut les mettre dans une balise [noparse].)
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 00h31   #12
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Je reformule ton problème : tu veux remplacer les balises
[CODE][/CODE] contenues dans des balises [LISTE][/LISTE] par des <DIV></DIV>.

Cela peut donc s'écrire ainsi :
Code :
1
2
3
4
 
$signature = preg_replace('!(\[LISTE\].*?)\[CODE\](.*?)\[\/CODE\](.*?\[\/LISTE\])!i', 
  "$1<div class="erreur">Code non autorisé : $2</div>$3",
  $signature) ;
$1 : la balise[LISTE] et ce qui suit jusqu'à [CODE] exclu
$2 : le contenu des balises [CODE][/CODE]
$3 : ce qui est après [/CODE] jusqu'à[/LISTE]
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 02h10   #13
Futur Membre du Club
 
Inscription : janvier 2008
Messages : 63
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 63
Points : 16
Points : 16
ah ok , merci Antoun ! J'ai compris le principe.
Encore merci++
beji15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h38.


 
 
 
 
Partenaires

Hébergement Web