IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

preg_match, preg_replace et les parenthèses


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2019
    Messages : 2
    Points : 5
    Points
    5
    Par défaut preg_match, preg_replace et les parenthèses
    Bonjour

    Mon but: dans une base de films, insérer un espace entre l'article du titre (repoussé à la fin de la chaîne, s'il existe) et le corps du titre

    Partant de la chaîne [c]"La planète rouge(La )"|/c] et espérant "La planète rouge (La )".
    J'essaie avec la séquence suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $pattern="#[A-Aa-z1-9](\((\w)+(\')*( )*\)( )*$)#";
    $untitre = "Planète rouge(La )";
    if(preg_match($pattern, $untitre, $matches)){ 
     
    {$newtitre = preg_replace($matches[1], " ".$matches[1], $untitre);};
    echo $newtitre,"\n";
    }

    J'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Planète rouge( (La ))"
    Je ne parviens pas à supprimer le double jeux de parenthèses
    J'ai essayé d'échapper les parenthèses des chaînes mais ça n'améliore rien
    Je ne vois pas comment faire.

    Merci si quelqun à une réponse à ce problème un peu bêta...

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Bonsoir,
    le problème est dans le premier argument que tu passes à preg_replace(). Cette fonction attend une regexp, et tu lui passes une chaîne qui commence par une parenthèse ouvrante et finit par une parenthèse fermante, "(La )". La fonction considère donc que les parenthèses sont les délimiteurs du motif, et ainsi elles ne sont pas prises en compte dans le remplacement. C’est comme si tu avais écrit "#La #".

    Comme solution simple tu peux utiliser str_replace() à la place de preg_replace().

    Mais si tu veux pousser un peu l’efficacité du code, tu peux tout faire en un seul preg_replace() (sans tester avec preg_match() avant), sachant que si le motif ne correspond pas, la chaîne sera laissée inchangée. Le secret est d’utiliser les marqueurs $1, $2, etc. dans la chaîne de remplacement comme expliqué dans la doc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $pattern = '#(\\S)(\\([\\w\'\\s]+\\))\\s*$#';
    echo $pattern, "\n";
     
    $untitre = 'Planète rouge(La )';
    $newtitre = preg_replace($pattern, '$1 $2', $untitre);
    echo $newtitre, "\n";
     
    $unautretitre = 'Planète rouge (La )'; // l’espace est déjà présente
    $newautretitre = preg_replace($pattern, '$1 $2', $untitre);
    echo $newautretitre, "\n"; // le motif ne rajoute pas d’espace
    J’utilise la classe \S qui signifie « tout sauf un espacement » (le contraire de \s). En l’occurence elle correspond au « e » de « rouge », et je l’utilise pour éviter de rajouter une espace quand il y en a déjà une.

    Attention à bien échapper deux fois les \ dans les motifs, pour éviter les ambigüités.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2019
    Messages : 2
    Points : 5
    Points
    5
    Par défaut
    Bonsoir Watilin

    Je te remercie pour ta réponse et tes solutions.
    J'avais finalement identifié le problème que le 1er argument de preg_replace devait etre une regexp.
    et je l'avais traité ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $pattern="#\([\w\']+\s*\)\s*$#";
    $titre="Planète rouge(une) ";
    if(preg_match($pattern, $titre, $matches)==1);
    {
    $oldarticle= "#".preg_quote($matches[0])."#";
     
    $newarticle=" ".$matches[0];
    $newtitre=  preg_replace($oldarticle, $newarticle, $titre);       
     
    echo $titre,",   " ,$newtitre, "\n";
    Ca fonctionne mais je suis confondu par la simplification qu'offre ton code.
    Et en plus je viens d'apprendre l'utilisation des resultat d'analyse de regexp $0, $1, $2...
    C'est génial!!!
    Merci en tous cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Vérifier les parenthèses
    Par moukit233 dans le forum Langage
    Réponses: 11
    Dernier message: 11/02/2010, 19h59
  2. ignorer les parenthèses
    Par wissem.ba dans le forum ASP.NET
    Réponses: 2
    Dernier message: 24/02/2009, 19h43
  3. marquer les accolades et les parenthèse
    Par imad_eddine dans le forum Visual Studio
    Réponses: 5
    Dernier message: 09/08/2007, 17h58
  4. Petite erreur concernant les parenthèses
    Par bugland dans le forum Langage
    Réponses: 14
    Dernier message: 04/01/2007, 11h21
  5. [Regex] Comment gérer les parenthèses ?
    Par davcha dans le forum Framework .NET
    Réponses: 7
    Dernier message: 27/03/2006, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo