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 :

[Tableaux] str_replace() sur expression régulière $1 dans une fonction ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut [Tableaux] str_replace() sur expression régulière $1 dans une fonction ?
    Bonjour à toutes et à tous.

    J'ai un petit soucis avec une fonction pour remplacer des espaces par des tirets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function liens($texte)
    	{
    	$pattern = "/=(.*)=/";
    	$id = $_GET['id'];
     
    	$replace = "<a href='www.domaine.com/".str_replace("_", "-", $_GET['var'])."-Zone-".$id."-".str_replace(" ", "-", "$1").".html' title='Consulter $1'>$1</a>";
    	$string = preg_replace($pattern, $replace, $texte);	
    	return $string;
    	}
    Alors voilà, les termes entourés par des signes "=" (sans guillemets) se transforment en liens comme suit :

    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="http://www.domaine.com/var-Zone-id-je%20suis%20ici.html">je suis ici</a>
    Comme vous pouvez le voir, j'ai bien utilisé la fonction str_replace() pour changer les espaces en tirets mais ça ne fonctionne pas ! :/
    Je pense qu'il y a un problème pour effectuer une fonction sur la variable $1...

    Quelqu'un saurait-il m'aider, s'il vous plait ?
    Merci d'avance.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Bonjour,

    La réponse est là :
    http://www.php.net/manual/fr/language.variables.php
    dans le paragraphe 'Validité des noms de variables'.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Bonjour, il ne s'agit pas à proprement parler d'une variable mais plutôt d'une expression régulière. Je ne peux donc pas définir un nom différent que $1 qui est automatiquement définit par le nombre d'occurences de (.*), ainsi la première se nomme $1, la seconde $2 et ainsi de suite.

    Mon réel problème est de ne pas pouvoir l'employer dans une requête php / sql...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    PHP interprête le contenu de ta chaine Lorsque tu écris C'est à dire qu'il cherche une variable de nom $1 et remplace $1 par le contenu de la variable (si celle-ci existe).

    Pour éviter ce comportement, tu dois utiliser des ' simples comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $replace = '<a href="www.domaine.com/'.str_replace('_', '-', $_GET['var']).'-Zone-'.$id.'-'.str_replace(' ', '-', '$1').'.html" title="Consulter $1">$1</a>';
    $string = preg_replace($pattern, $replace, $texte);

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Rien n'y fait, même en utilisant ton exemple j'obtiens le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.domaine.com/jeu-Zone-id-je%20suis%20ici.html
    les espaces ne sont toujours pas remplacés par des tirets ! *sic*

    (au passage, merci d'essayer de m'aider)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    La cause de ton problème, c'est que le str_replace est exécuté avant l'expression régulière et non dans le cadre de celle-ci.

    Tu devrais regarder la fonction preg_replace_callback, qui te permet d'obtenir ce que tu souhaites.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function liens($texte){
    	return preg_replace_callback( '/=([^=]+)=/', lien, $texte );
    }
    function lien($matches){
    	return '<a href="www.domaine.com/'.str_replace('_', '-', $_GET['var']).'-Zone-'.$_GET['id'].'-'.str_replace( ' ', '-', $matches[1] ).'.html" title="Consulter '.$matches[1].'">'.$matches[1].'</a>';
    }

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    HAN ! Tu es un Dieu ! :D
    J'ai même réussi à coupler ça avec ma base de données !

    Tu vas me permettre de réaliser un énorme projet ! Un grand merci à toi !!! ^^

    J'ai juste un petit bug quand j'applique la fonction à un texte qui comporte plusieurs ensembles de mots à transformer, mais je vais chercher un peu, quand même... Si je trouve pas je reviendrais demander de l'aide.

    Encore merci !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    Rebonjour !

    J'ai donc réussi à faire fonctionner la fonction avec J'aimerais maintenant pouvoir utiliser des sortes de balises sur les mots à transformer à la place des signes "=" !

    Par exemple, au lieu de j'aimerais utiliser ou bien voir même mais, lorsque j'utilise l'une de ces options, ça foire et je ne sais pas pourquoi... :/ Apparemment, c'est un problème d'incompatibilité des caractères avec le dans le preg_replace_callback !

    Merci d'avance à celle ou celui qui pourra m'aider.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    *, [ et ] sont pris en compte comme des caractères spéciaux par l'expression régulière, tu doit donc les échapper pour pouvoir les utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '/\*\*([^\*]+)\*\*/'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '/\[trans\]([^\[]+)\[trans\]/'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    '/<link>([^<]+)</link>/'
    Je n'ai pas testé, mais cela devrait fonctionner "out of the box"

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Par défaut
    ça marche impec ! Merci !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/08/2014, 09h25
  2. [2005 Express] un EXEC dans une fonction tabulaire
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 17/02/2009, 19h04
  3. Réponses: 5
    Dernier message: 02/10/2006, 19h24
  4. [RegEx] Petit Bug sur Expression Régulière
    Par Delphy113 dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2005, 20h48
  5. Ouvrir un fichier sur un double-clic dans une TListBox
    Par SegmentationFault dans le forum Composants VCL
    Réponses: 4
    Dernier message: 09/08/2004, 17h22

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