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
    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
    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
    mais si on a <p>mot</p> il faut le parser !

  4. #4
    Membre émérite
    Dans ce cas tu peux utiliser une assertion :

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

  5. #5
    Membre du Club
    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
    ?!, 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
    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

    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
    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. ###raw>post.musername###
    Rédacteur
    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);
     
    ?>
      0  0

  11. #11
    Membre du Club
    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

    Tu sais, c'est un peu pour ça qu'on a inventé le BBCode, en fait...

  13. #13
    Membre du Club
    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 <img src="images/smilies/icon_smile.gif" border="0" alt="" title=":)" class="inlineimg" />
    	return $str;
    }
    ob_start();
    include('mapage.php');
    $page = ob_get_contents(); 
    ob_end_clean();
    echo replace($page);

  14. #14
    Rédacteur

    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.

###raw>template_hook.ano_emploi###