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 :

str_replace sur un mot entre dièse


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 20
    Par défaut str_replace sur un mot entre dièse
    Bonjour,

    Je voudrais créer une fonction qui str_replace un certain mot, qui est entre des #.

    Par exemple, la chaine "Tous les #livres# que j'ai lu sont #bons#" deviendrait "Tous les <b>livres</b> que j'ai lu sont <b>bons</b>".

    Je suis sûr que beaucoup de scripts font des trucs comme ça, comme dans les wiki avec des href ou les forums grâce aux balises [b] par exemple, mais je voudrais connaître un script optimal.

    Merci

  2. #2
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bonjour,

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $reg = '~#(.*)#~Usi';
     
    $chaine = preg_replace($reg, "<b>$1</b>", $chaine);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 20
    Par défaut
    Merci bien
    Voila bien le genre de code avec expressions régulières que je ne sortirai jamais

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 20
    Par défaut
    Une petite question tout de même, comment utiliser le mot sur une requête ?

    Par exemple "Tous les #livres# que j'ai lu sont #bons#".
    Je voudrais que les mots 'livres' et 'bons' soient soumis à une requête avant d'être mis en gras.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 20
    Par défaut
    Petit UP et plus de précisions en même temps :

    Ce que je veux faire exactement est une petite infobulle "title" pour les mots concernés, cela donnerait un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function bulle($mot) {
    	$req = "SELECT def FROM lexique WHERE mot = '$mot'";
    	$def = mysql_result($req,'def');
     
    	return "<a title='$def'>$mot</a>";
    }
     
    function texte($chaine) {
    	$reg = '~#(.*)#~Usi';
    	$chaine = preg_replace($reg, bulle($1), $chaine);
     
    	return $chaine;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo texte("Ces enfants sont très #égocentriques#.");
    //Qui retournerait donc "Ces enfants sont très <a title='consiste à ne concevoir le monde que de son seul point de vue'>égocentriques</a>"

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Non, parce que votre fonction serait appelée une seule fois avant l'exécution de preg_replace : toute correspondance se verrait remplacée par <a title=''></a> (d'autant que la requête n'est pas exécutée et que $1 n'est pas valide, surtout dans ce contexte).

    Il faut que ce code soit exécuté lors du remplacement et pour ça il faut utiliser la fonction preg_replace_callback ou utiliser le flag e :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function texte($chaine) {
        return preg_replace_callback(
            '~#(.*)#~Usi',
            function ($matches) {
                $q = mysql_query('SELECT def FROM lexique WHERE mot = "' . mysql_real_escape_string($matches[1]) . '"');
                if (mysql_num_rows($q) == 1) {
                    $def = mysql_result($q, 'def');
                    return '<a title="' . htmlspecialchars($def, ENT_QUOTES/*, 'UTF-8'*/) . '">' . /*htmlspecialchars(*/$matches[1]/*, ENT_QUOTES*//*, 'UTF-8'*/) . '</a>';
                } else {
                    return $matches[0];
                }
            },
            $chaine);
    }
    (non testé - la fonction anonyme requiert PHP >= 5.3 sinon il faudra adapter)

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/02/2012, 09h21
  2. Différence sur un FLOAT entre un "=" et un LIKE
    Par BrYs dans le forum Requêtes
    Réponses: 2
    Dernier message: 12/07/2005, 12h04
  3. Condition sur un mot
    Par le mage tophinus dans le forum Linux
    Réponses: 8
    Dernier message: 03/06/2005, 14h59
  4. Agir sur le texte entré dans un éditeur
    Par FatalError dans le forum C++
    Réponses: 1
    Dernier message: 24/10/2004, 14h54
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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