Remplacer tout ce qui se trouve entre href"" dans une page

Eléphant du PHP | 117 Messages

13 août 2009, 18:57

Bonjour à tous,

J'ai un petit problème depuis quelques jours, j'ai un contenu html stocké dans ma base de données, dans ce contenu html j'ai pas mal de liens <a href="...">
J'aimerais pouvoir remplacer tout ce qui se trouve à l'intérieur de href"" de cette manière :

exemple :
<a href="www.monsite.fr" title="Lien vers mon site">Cliquez sur le lien</a>
par <a href="www.monsite.fr/1/500" title="Lien vers mon site">Cliquez sur le lien</a>

J'ai testé avec pas mal de fonction php mais sans vraiment réussir à obtenir ce que je voulais.
J'ai vu qu'il existait la fonction preg_match_all qui doit servir à ça à mon avis mais je ne comprends pas trop comment l'utiliser, apparement ça fonctionne avec les expressions rationnels donc ça pourrait correspondre à ce que je recherche.

Merci d'avance pour vos réponses.

ViPHP
ViPHP | 3607 Messages

13 août 2009, 22:46

Alors déjà se sont des expressions régulières (ça ira mieux pour rechercher des tutos ;) )
Et voici un tutoriel, ainsi qu'un testeur d'expression régulière: http://lumadis.be

Mais avant de te lancer là-dedans, explique nous un peu le pourquoi du comment? parcequ'il y a peut-être plus simple...?
Donne nous plus d'infos ;)

Mammouth du PHP | 2937 Messages

14 août 2009, 00:07

Et preg_replace (), elle sert à quoi ? ;)

Eléphant du PHP | 117 Messages

14 août 2009, 09:09

Bonjour et merci pour ta réponse.
Je n'avais pas vu preg_replace, c'est vrai que ça a l'air de correspondre à ce que je recherche mais ça fonctionne encore avec des expressions régulières ...
J'ai beau testé cette fonction je ne comprends pas trop les expressions régulières, je n'ai jamais été doué pour ça.

J'ai mon texte :
$texte = stripslashes($page['html']);

Je sais ce que je veux remplacer :
<a href="monsite.fr" title="mon site">Cliquez ici</a> par <a href="monsite.fr/1/564" title="monsite">Cliquez ici</a>

Donc si j'ai bien compris tout va se jouer dans le pattern (et là je coince) :
$pattern = '';

Ma chaîne de remplacement (je coince aussi) :
$replacement = '';

Et mon nouveau texte :
$nouveau_texte=preg_replace($pattern, $replacement, $texte);

En fait je bloque juste au niveau des expressions régulières (juste = complétement perdu).

Pouvez-vous m'aiguiller un tout petit peu ?

Merci d'avance.

ViPHP
ViPHP | 3607 Messages

14 août 2009, 09:11

Es-tu allé lire le tutoriel que je t'ai linké, as-tu fait des essais via le testeur?

Eléphant du PHP | 117 Messages

14 août 2009, 09:12

Alors déjà se sont des expressions régulières (ça ira mieux pour rechercher des tutos ;) )
Et voici un tutoriel, ainsi qu'un testeur d'expression régulière: http://lumadis.be

Mais avant de te lancer là-dedans, explique nous un peu le pourquoi du comment? parcequ'il y a peut-être plus simple...?
Donne nous plus d'infos ;)
Le pourquoi du comment, c'est tout simple.
J'ai créé une newsletter en html et avant de l'envoyer je veux mettre des paramètres dans les url pour pouvoir faire des statistiques.
Donc une newsletter en html avec des <a href="..."> un peu partout dedans et moi qui veut mettre des paramètres dans ce href pour mes stats, je ne vois pas plus simple.

Eléphant du PHP | 117 Messages

14 août 2009, 09:16

Es-tu allé lire le tutoriel que je t'ai linké, as-tu fait des essais via le testeur?
Je suis en train de faire des tests mais je t'avoues que je galère pas mal.

Eléphant du PHP | 117 Messages

14 août 2009, 09:22

Bon voilà apparement j'ai trouvé ce qu'il me fallait grâce à ton tuto :
#<a href="(.*?)"#

ça me retourne tout ce qui commence par <a href=" et qui finit par " donc en gros ça me retourne <a href="www.monsite.fr"
Maintenant il me reste à remplacer cette chaine par <a href="www.monsite.fr/1/564" et le tour sera joué.

ViPHP
ViPHP | 3607 Messages

14 août 2009, 09:28

Bon alors y a peut-être plus simple que de te mettre aux expressions régulière (mais tu peux essayer pour le fun malgrès tout ;) )
Pourquoi ne pas mettre dans ta Bdd directement dans ton html par exemple:

Code : Tout sélectionner

<a href="%URL_SITE%%CODE_STATISTIQUES%">gflerzgh</a>
Ensuite avant l'envoi, tu as simplement à faire un str_replace():
<?php
$letter_html="Hello %NOM_USER%,<br />
Va sur mon <a href=\"%URL_SITE%%CODE_STATISTIQUES%\" title=\"mon super site\">super site</a>.<br />
Merci";

// Remplacement des paramètres

$letter_html=stre_replace('%URL_SITE%','http://monsite.fr',$letter_html);
$letter_html=stre_replace('%CODE_STATISTIQUES%','/x/y',$letter_html);
$letter_html=stre_replace('%NOM_USER%','tartampion',$letter_html);
Comme ça c'est plus simple et surtout plus performant ;)

Eléphant du PHP | 117 Messages

14 août 2009, 09:34

Je ne peux malheureusement pas faire ça.
Pour créer ma newsletter j'utilise un éditeur wysiwyg, de plus je ne suis pas le seul à créer des newsletters et en plus je voudrais que ça se fasse automatiquement.
Donc avec l'éditeur wysiwyg, je rentre l'url du href donc je ne peux pas rentrer de paramètre en plus.

J'espère que tu comprendras ce que je veux dire.

ViPHP
ViPHP | 3607 Messages

14 août 2009, 09:39

Ben pourtant c'est aussi simple de tapper %URL_SITE% que monsite.fr non?
Les autres utilisateurs peuvent comprendre facilement ;)

Bon après j'ai peut-être pas tout en main, mais tu peux afficher les variables à leurs disposition, et ensuite ben il les mettents ou pas...

Bref si tu veux toujorus utilise les expressions régulières, pour le replace, il faut que tu utilises $1 pour remettre ce qui a été capturé entre les parenthèses ;)

Eléphant du PHP | 117 Messages

14 août 2009, 09:41

Voilà j'ai trouvé avec preg_replace()

//je met mon pattern href="www.monsite.fr"
$pattern='#href="(.*?)"#';
//je le remplace par href="www.monsite.fr/1/564"
$replacement='href="$1/1/564"';

//je procède au remplacement
$nouvelle_newsletter=preg_replace($pattern, $replacement, $newsletter_strip);

Voilà ça me sort le bon résultat.
Je ne pensais pas que ça allait être aussi simple.

ViPHP
ViPHP | 3607 Messages

14 août 2009, 09:43

Bravo en tout cas ;)
Mais je reste persuadé que tu pourrais t'en sortir avec de simples str_replace ;)
En tout cas tu as vite compris les expressions régulières, c'est pas souvent que ça rentre aussi bien :)

Eléphant du PHP | 117 Messages

14 août 2009, 09:55

Bravo en tout cas ;)
Mais je reste persuadé que tu pourrais t'en sortir avec de simples str_replace ;)
En tout cas tu as vite compris les expressions régulières, c'est pas souvent que ça rentre aussi bien :)
Merci pour ton aide et ton lien vers les tutos (très bien fait).
Pour les str_replace() je trouve que ça fait faire des manips en plus aux personnes qui créent les newsletters et qui ne sont pas forcément doués à la base donc si on leur demande encore une chose en plus, ça devient vraiment compliqué. L'avantage avec les expression régulières c'est que l'intervention humaine n'est pas nécessaire donc pas de manip en plus.

En tout merci pour ton aide, je viens de tester en grandeur nature sur une newsletter et ça fonctionne parfaitement.

Sujet clos.

Eléphant du PHP | 369 Messages

14 août 2009, 10:31

Salut,
Bonjour à tous,
J'ai un petit problème depuis quelques jours, j'ai un contenu html stocké dans ma base de données, dans ce contenu html j'ai pas mal de liens <a href="...">
J'aimerais pouvoir remplacer tout ce qui se trouve à l'intérieur de href"" de cette manière :
exemple :
<a href="www.monsite.fr" title="Lien vers mon site">Cliquez sur le lien</a>
par <a href="www.monsite.fr/1/500" title="Lien vers mon site">Cliquez sur le lien</a>
J'ai testé avec pas mal de fonction php mais sans vraiment réussir à obtenir ce que je voulais.
J'ai vu qu'il existait la fonction preg_match_all qui doit servir à ça à mon avis mais je ne comprends pas trop comment l'utiliser, apparement ça fonctionne avec les expressions rationnels donc ça pourrait correspondre à ce que je recherche.
Merci d'avance pour vos réponses.
Ci après est un exemple rapide de ce que peut donner un remplacement entre <a href...> mais ceci implique
une chaine de remplacement identique donc je doute que ce soit ce que tu cherches:
<?php

 $dta  = "<a href=\"./envoyer.php\" id=\"envoyer\" title=\"Envoyer...\">Envoyer</a> de bon ";
 $dta .= "matin un lien <a href=\"./modifier.php\" id=\"modifier\" title=\"Modifier...\">modifier</a> ";
 $dta .= "ne peut qu'amuser comme disait le penseur <a    href =       \"./xara.php\" id=\"xara\" ";
 $dta  = "title=\"Xara...\">Xara</a> ";
 $dta .= "&agrave; l'un de ses &eacute;tudiant.<br />";

 $delim = "~";

 $strNewTxt = "un_texte";
 $pattern = "".$delim."<a[ ]*?href[ ]*?=[ ]*?\"(.*?)\"".$delim."";
 $dtaNew = preg_replace($pattern, "<a href=\"$1?".$strNewTxt."\"", $dta);

 $cde  = "<h2>\n";
 $cde .= "   Exemple... Forme originale :\n";
 $cde .= "</h2>\n";
 $cde .= "<em>\n";
 $cde .=    $dta."\n";
 $cde .= "</em>\n";
 $cde .= "<br />\n";
 $cde .= "<hr />\n";

 $cde .= "<h2>";
 $cde .= "   Exemple... Forme modifie&eacute; :";
 $cde .= "</h2>\n";
 $cde .= "<em>\n";
 $cde .=    $dtaNew."\n";
 $cde .= "</em>\n";
 $cde .= "<br />\n";
 $cde .= "<hr />\n";

 echo $cde;
?>
Au vu de ton dernier message j'essaie une approche didactique... (j'essaie en tout cas...)

1) Le pattern doit être ouvert & fermé par des délimitateurs -ceux-ci doivent être uniques et identiques-
2) Les occurences sont notées par le signe $ et commencant par 1 et sont/peuvent être trouvées par les parenthèses.
3) Les crochets indiquent 1 (et un seul) caractère suivit par (ou pas d'espace(s): *?

Les caractères d'échappement sont notés \ mais bon, ca tu sais donc : nc.

Voila, l'exemple ci-dessus est bateau mais j'ai tenté de le faire facile donc compréhensible, à toi
de le modifier et "surtout" de l'adapter à tes besoin.

Ce qui (j'imagine) est d'ajouter quelque chose après le lien en fonction de la valeur ID du A en ce cas
le preg_ pour un tel remplacement semble un brin léger... Je te conseille plus tôt de faire un while
et boucler sur une liste d'ID liés au texte à ajouter.

Je me relis mais ca devient de moins en moins clair ce que je dis lol
J'espere en tout cas avoir donné une piste.

Bon code @+ ;)

PS: Effectivement preg_match_all peut être aussi utilisé dans ce cas il te suffirait de cibler ta
chaine LINK dans le tableau résultant, de lui ajouter ce que tu veux, puis faire une sorte d'implode
mais ce me semble bcp (bcp) moins efficace que ma proposition... 'fin à toi de voir ;)

PS2: jojolapine tu m'as grillé lol Gratz, il est vrai que ta solution est carrément plus facile ET rapide
Modifié en dernier par FuZZyLine le 14 août 2009, 10:40, modifié 1 fois.