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 :

Remplacement d'URLs à la volée


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 469
    Points : 525
    Points
    525
    Par défaut Remplacement d'URLs à la volée
    Bonjour,

    J'ai une variable du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $montexte='blabla <a href="http://www.toto.com/toto.html">blabla</a> blablabla <a href="http://www.pouet.com/pouet.html">blabla</a> blablabla';
    Mon but est de remplacer ces liens par des redirections :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $montexte='blabla <a href="http://www.monsite.com/lien.php?id=1">blabla</a> blablabla <a href="http://www.monsite.com/lien.php?id=2">blabla</a> blablabla';
    Capter chaque url pour la remplacer.
    Avant de vous solliciter j'ai regardé les regex, remplacer une url ne pose pas de problème mais plusieurs si, je n'y arrive pas.

    Si quelqu'un pouvait me donner un coup de pouce ce serait fooooormidable.

    Merci à vous.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    quelque chose 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    $str = 'blabla <a href="http://www.toto.com/toto.html">blabla</a> blablabla <a href="http://www.pouet.com/pouet.html">blabla</a> blablabla';
     
    $id  = 0;
    $i   = 0;
    $len = strlen($str);
    $url = [];
     
    while (($start = stripos($str, 'href="', $i)) !== false)
    {
        $end = stripos($str, '"', $start + 6);
        if ($end === false)
        {
            break;
        }
     
        $url[substr($str, $start + 6, $end - $start - 6)] = 'http://www.monsite.com/lien.php?id='.++$id;
     
        $i += ++$end;
        if ($i >= $len)
        {
            break;
        }
    }
     
    $new_str = str_replace(
        array_keys($url),
        $url,
        $str
    );

  3. #3
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    En un peu moins de lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $str = 'blabla <a href="http://www.toto.com/toto.html">blabla</a> blablabla <a href="http://www.pouet.com/pouet.html">blabla</a> blablabla';
    $id  = 0;
     
    $str = preg_replace_callback( '# href="[^"]+"#', function ( $matches ) use ( &$id ) {
       $id++;
       return ' href="http://www.monsite.com/lien.php?id=' . $id . '"';
    }, $str );

  4. #4
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 469
    Points : 525
    Points
    525
    Par défaut
    Mhh comment dire Woooow !

    Un grand merci à vous deux c'est parfait

  5. #5
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 469
    Points : 525
    Points
    525
    Par défaut
    Mhhh... juste une dernière chose comment insérer dans ma base l'ancienne url pour faire la correspondance ?

    Je suis désolé.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $str = preg_replace_callback( '# href="[^"]+"#', function ( $matches ) use ( &$id ) {
       $id++;
       mysql_query("INSERT INTO `links` (`linkID`, `link`) VALUES ('$id', 'XXXXX')");
     
       return ' href="http://www.monsite.com/lien.php?id=' . $id . '"';
    }, $str );
    Merci

  6. #6
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Il faut que tu catches l'URL dans l'expression régulière et que tu utilises le match dans ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $str = preg_replace_callback( '# href="([^"]+)"#', function ( $matches ) use ( &$id ) {
       $id++;
       var_dump( $matches[1] );
     
       return ' href="http://www.monsite.com/lien.php?id=' . $id . '"';
    }, $str );
    Après, je te conseille de construire ta requête d'INSERT pour n'en faire qu'une grosse à la fin du preg_replace_callback(), histoire d'optimiser le script (si tu as 15 URLs, ça ne fera qu'une seule requête d'INSERT au lieu de 15).

    Sans oublier de bien protéger tes données pour éviter les injections SQL.

  7. #7
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 469
    Points : 525
    Points
    525
    Par défaut
    Ok.
    Je te remercie.

    Par contre au niveau du risque d'injection je ne vois pas : le risque sera le même avec une ou plusieurs requêtes

  8. #8
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Citation Envoyé par Gaetan_ Voir le message
    le risque sera le même avec une ou plusieurs requêtes
    Evidemment. Mais il faut s'en protéger dans tous les cas.

  9. #9
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 469
    Points : 525
    Points
    525
    Par défaut
    Voilà
    Bon (je suis tout rouge) je ne vois pas comment limiter à 1 requête dans le cas où il y est 15 urls...

    Je sèche

  10. #10
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Comme ça par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $str       = 'blabla <a href="http://www.toto.com/toto.html">blabla</a> blablabla <a href="http://www.pouet.com/pouet.html">blabla</a> blablabla';
    $id        = 0;
    $sep       = '';
    $sqlInsert = '
       INSERT INTO
          `links` (`linkID`, `link`)
       VALUES
    ';
     
    $str = preg_replace_callback( '# href="([^"]+)"#', function ( $matches ) use ( &$id, &$sep, &$sqlInsert ) {
       $id++;
       $sqlInsert .= $sep . ' (' . (int) $id . ', "' . mysql_real_escape_string( $matches[1] ) . '") ';
       $sep        = ', ';
     
       return ' href="http://www.monsite.com/lien.php?id=' . $id . '"';
    }, $str );
     
    mysql_query( $sqlInsert );
    A savoir que l'extension MySQL est obsolète et qu'il vaut mieux utiliser MySQLi ou PDO.

  11. #11
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 469
    Points : 525
    Points
    525
    Par défaut
    Je suis bluffé.

    Un grand merci pour ta patience et tes explications.

    Bonne journée.


    Merciii i i i i i !! ! ! !

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

Discussions similaires

  1. [RegEx] Remplacement d'URLs par des URLs cliquables
    Par khayyam90 dans le forum Langage
    Réponses: 1
    Dernier message: 18/10/2011, 20h29
  2. Remplacer un caractère à la volée
    Par BLJ.CHAUVIN dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 19/09/2010, 16h23
  3. lien qui ajoute au lieu de remplacer l'url
    Par dkmatt dans le forum Django
    Réponses: 1
    Dernier message: 26/04/2010, 14h31
  4. Réponses: 4
    Dernier message: 11/02/2008, 20h43
  5. remplacer un caractere à la volée
    Par philippe123 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/10/2006, 23h40

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