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

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : novembre 2005
    Messages : 57
    Points : 48
    Points
    48
    Par défaut Parser une page pour remplaçer des mots par d'autres
    Bonjour,

    voilà je souhaite remplacé des mots dans une page par d'autres.
    j'ai donc effectuer un str_replace sur ma variable.

    Mais, mon problème vient du fait que je veux rajouter un lien sur certains mots :

    mot1 devient <a href="page-sur-ce-mot1.php">mot1</a>

    sans toutefois rajouter de liens sur les mots qui ont déjà un lien ou si le mot se trouve dans une balise title, meta..
    <a href="">mot1</a> => pas de remplacement
    <title>mot1</title> => pas de remplacement



    est-ce possible avec un puissant reg ?
    comment procéder ?

    Les solutions auquelles j'ai pensé en vrac :
    utiliser un parser xml sur du code xhml.
    ignorer les balises a, title, ..etc pour isoler les zones où l'on remplace les mots et y appliquer notre str_replace.

    Merci pour vos pistes

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    février 2005
    Messages
    2 020
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 2 020
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    ca doit être faisable avec un motif de ce style :

    $patt = '`([^>])(mot1)([^<])`si';
    $out = '[[$2]]';
    echo preg_replace($patt, $out, $str);


    Bye
    Vive les roues en pierre

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : novembre 2005
    Messages : 57
    Points : 48
    Points
    48
    Par défaut
    mais si on a <p>mot</p> il faut le parser !

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    février 2005
    Messages
    2 020
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 2 020
    Points : 2 273
    Points
    2 273
    Par défaut
    Dans ce cas tu peux utiliser une assertion :

    $patt = '`(mot1)(?!</title>|</a>)`si';
    Vive les roues en pierre

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : novembre 2005
    Messages : 57
    Points : 48
    Points
    48
    Par défaut
    tu pourrais m'expliquer à quoi correspond le !? et le 'si'
    thx!

    et ca ne fonctionnera pas si l'on a un motif de ce genre :
    <title>baablbalbla mot baabl</title>

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    février 2005
    Messages
    2 020
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 2 020
    Points : 2 273
    Points
    2 273
    Par défaut
    ?!, c'est une assertion avant négative; un test sur les caratères suivants.
    s, c'est pour que que le caractère . remplace définisse n'importe quel caractère plus les sauts de ligne
    i, c'est l'insensibilité à la casse lors de la recherche
    Vive les roues en pierre

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    février 2005
    Messages
    2 020
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2005
    Messages : 2 020
    Points : 2 273
    Points
    2 273
    Par défaut
    Bon c'est plus chaud que prévu ^^
    En fait il faudrait quelque chose comme ca :
    $patt = '`(?<!<a.*>])\b(mot1)\b(?!</a>)`i';
    Le problème est qu'il faut fixer une taille lors d'une assertion arrière et ca "<a.*>", ca passe pas. Il faudrait voir du côté des assertion "?>".
    Vive les roues en pierre

  8. #8
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : février 2004
    Messages : 13 721
    Points : 29 844
    Points
    29 844
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $string = "J'aime le PHP ! Pourtant, certains scripts en <b>PHP</b> sont bien complexes, surtout s'il faut gérer tous les liens comme <a href=\"http://www.php.net/\">PHP</a>...";
    $word = 'PHP';
     
    echo preg_replace('#'.$word.'(?!</a|</title)#', '<a href="link.php">'.$word.'</a>', $string);
     
    ?>

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : novembre 2005
    Messages : 57
    Points : 48
    Points
    48
    Par défaut
    ok on va compliqué les choses !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $string = "<p id=\"PHP\">Oui c'est génial !</p>J'aime le <a href="PHP.php">PHP</a> ! Pourtant, certains scripts en <b>PHP</b> sont bien complexes, surtout s'il faut gérer tous les liens comme <a href=\"http://www.php.net/\">PHP</a>...";
    id=\"PHP\" et PHP.php sont parsés !
    Il faudrait ignorer ce qui est à l'intérieur de balise :O

    d'ailleurs ca ne fonctionnent pas avec ce type chaîne :
    $string = "J'aime le PHP ! <title>Pourtant, certains scripts en PHP sont bien complexes</title>, surtout s'il faut gérer tous les liens comme <a href=\"http://www.php.net/\">PHP youpi</a>...";

  10. #10
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : février 2004
    Messages : 13 721
    Points : 29 844
    Points
    29 844
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $string = '<p id="PHP">Oui c\'est génial !</p>J\'aime le <a href="PHP.php">PHP</a> ! Pourtant, certains scripts en <b>PHP</b> sont bien complexes, surtout s\'il faut gérer tous les liens comme <a href="http://www.php.net/">PHP</a>...';
    $word = 'PHP';
     
    echo preg_replace('#(?<!")'.$word.'(?!"|</a|</title)#', '<a href="link.php" title="'.$word.'">'.$word.'</a>', $string);
     
    ?>

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : novembre 2005
    Messages : 57
    Points : 48
    Points
    48
    Par défaut
    donc si j'ai bien compris :
    echo preg_replace('#(?<!")'.$word.'(?!"|</a|</title)#', '<a href="link.php" title="'.$word.'">'.$word.'</a>', $string);

    (?<!") : si on a < et " juste avant PHP
    donc on a un problème sur ce genre de chaîne : <p id="tralal PHP">

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo preg_replace('#(?<!.*")'.$word.'(?!"|</a|</title)#', '<a href="link.php" title="'.$word.'">'.$word.'</a>', $string);
    est sencé fonctionné ?

    ahh nan j'ai compris ?<! est une assertion arrière négative! donc vrai si l'on a pas de " avant

    edit : un autre problème avec $string = 'les guillemets font tout capoter notre script "PHP" '

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : février 2004
    Messages : 13 721
    Points : 29 844
    Points
    29 844
    Par défaut
    Tu sais, c'est un peu pour ça qu'on a inventé le BBCode, en fait...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    novembre 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : novembre 2005
    Messages : 57
    Points : 48
    Points
    48
    Par défaut
    c'est pas vraiment pour un textarea, je souhaite parser mes pages et remplacer certains mots par un lien.
    Je vais avoir une table dans laquel j'ai le lien entre tous les mots à remplacer et le lien équivalent.

    J'étais donc parti sur ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function replace($str)
    {
    // c'est ici que ca coince :)
    	return $str;
    }
    ob_start();
    include('mapage.php');
    $page = ob_get_contents(); 
    ob_end_clean();
    echo replace($page);

  14. #14
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : février 2004
    Messages : 13 721
    Points : 29 844
    Points
    29 844
    Par défaut
    Je me suis mal exprimé.
    Je voulais dire que ton approche n'est pas la meilleure. Il est préférable de traiter les informations lors de leur extraction de la BDD plutôt que de traiter le code HTML produit. C'est largement plus simple.
    Pour un site synamique, cela ne devrait pas poser de problèmes.

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/07/2011, 18h09
  2. Réponses: 2
    Dernier message: 22/10/2007, 18h50
  3. [Mail] Codage d'une page pour envoyer des messages.
    Par cyrilmarc dans le forum Langage
    Réponses: 5
    Dernier message: 21/11/2006, 22h53
  4. parser une page HTML pour en retirer de l'info
    Par belakhdarbts10 dans le forum ASP
    Réponses: 1
    Dernier message: 29/10/2006, 19h38
  5. [POO] Problème pour Parser une page XML
    Par Death83 dans le forum Langage
    Réponses: 18
    Dernier message: 29/08/2006, 11h15

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