Page 1 sur 1

Rechercher / Remplacer une chaine de caractère dans un texte

Posté : 09 oct. 2005, 00:41
par Paul
Bonsoir à tous,

Je cherche à savoir comment faire une fonction rechercher / remplacer dans un texte, pour remplacer les liens internes qui ont la forme :

<a href="tutoriaux/index.php">Tutoriaux PHP France</a>

Par :

<a href="http://www.phpfrance.com/tutoriaux/index.php">Tutoriaux PHP France</a>

Je cherche à remplacer uniquement les liens internes au site.

Merci davance,

Paul

Posté : 09 oct. 2005, 01:02
par mcorgnet
il te faut utiliser les expressions régulières (il y a un tutorial sur ce site) ... Je ne suis pas doué pour ça, mais en cherchant bien tu devrais y arriver.

Bon courage.

M.

Posté : 09 oct. 2005, 02:16
par Invité
Merci, en lisant ce tuto : http://www.phpfrance.com/tutoriaux/inde ... pcre-ripat

J'ai eu mal à la tête, c'est encore au dessus de ce que je sais faire en php :) , j'arrive pas à trouver comment aboutir à un truc du genre :

Si dans le texte il y a des chaines de caractères qui commencent par :
<a href="

et qui ne sont pas suivies de http://www.phpfrance.com/

alors ajouter http://www.phpfrance.com/
après : <a href="


Voilà, je crois que mon problème se traduit ainsi mais transformer des dires en php, j'y arrive pas toujours ou alors il peut se passer 6 mois avant que j'y parvienne.

Posté : 09 oct. 2005, 09:48
par Cyrano
Mouais, c'est vrai que ce n'est pas du tout facile à aborder. Je viens de faire quelques essais avant parce que je suis loin de maîtriser les PCRE à fond, mais j'ai réussi à faire un truc qui marche :
<?php
/* On part d'une chaine de caractère contenant des liens */
$lien_base = 'Les adresses <a href="tutoriaux/index.php">Tutoriaux PHP France</a> et <a href="forums/index.php">Les forums de PHPFrance</a> ont en apparence les mêmes formes, mais celle-ci, <a href="http://www.lumadis.be/regex/test_regex.php">une lien vers ailleurs</a>, a une forme différente et sa forme n\'est pas remplacée.';
$masque = '#(<a\shref=")(\w*/)#';
$ajout = 'http://www.phpfrance.com/';
$remplacement = '$1'.$ajout.'$2';
$nouvelle = preg_replace($masque, $remplacement, $lien_base);
echo("<p>". $nouvelle ."</p>\n");
?>
C'est incomplet, mais selon les formes que tu as indiquées, ça fonctionne très bien. Exécute ce code et affiche le dans une page: regarde ensuite le code source html généré.

Posté : 09 oct. 2005, 16:57
par Paul
Merci beaucoup, il m'aurait fallu pas mal de temps pour aboutir à un résultat. Je cherche maintenant à l'intégrer dans une fonction :

Code : Tout sélectionner

function pdf_propre($texte) { $trans = get_html_translation_table(HTML_ENTITIES); $trans = array_flip($trans); $trans["<br />\n"] = "<BR>"; $trans["œ"] = "oe"; $trans["…"] = "..."; $trans["’"] = "'"; $trans["–"] = "-"; $trans["‘"] = "'"; $trans["“"] = "\""; $trans["”"] = "\""; $trans["&ucirc;"] = "û"; $texte = strtr($texte, $trans); $texte = ereg_replace("\"", "\\\"", $texte); $texte = ereg_replace("(&nbsp;| )+", " ", $texte); $masque = '#(<a\shref=")(\w*/)#'; $ajout = 'http://www.phpfrance.com/'; $remplacement = '$1'.$ajout.'$2'; $texte = preg_replace($masque, $remplacement, $texte); return $texte; }
Mais ça ne fontionne plus, si vous avez une idée ?

Je vais chercher...

Merci encore,

Paul

Posté : 09 oct. 2005, 17:06
par Cyrano
Je ne comprends pas ce que tu essayes de faire: tu définis une première fois $trans et ensuite tu la redéfinis en ajoutant des index... :-k

Essaye ceci et exécute le, tu vas voir quelque chose d'intéressant :
<?php
$trans = get_html_translation_table(HTML_ENTITIES);
?>
<pre>
<?php
var_dump($trans);
?>
</pre>

Posté : 09 oct. 2005, 18:33
par Paul
En fait, je cherche à générer des articles au format pdf avc FPDF, je nettoie le code html et je cherche à faire en sorte que le pdf généré qui a des liens internes de la forme <a href="test.php

renvoient vers des liens correctes, car lorsque je génère le pdf, ils prennent la forme suivante : <a href="http://www.phpfrance/IMG/_article_PDF/test.php

au lieu de <a href="http://www.phpfrance/test.php

C'est pas très clair comme explication alors voici un exemple sur un site en construction : http://peupleso.1formatik.com/CIDR/Phot ... roite.html , cliquez sur l'icone pdf.

Merci pour votre aide et patience.

Paul

Posté : 09 oct. 2005, 18:49
par Paul
Voici aussi le lien vers le fichier qui permet de générer le pdf :

http://peupleso.1formatik.com/CIDR/sque ... e_pdf.html

(Voir code source)

Je précise que j'utilise un fichier mes_fonctions.php3 dans lequel se trouve cette fonction :

Code : Tout sélectionner

function pdf_first_clean($texte) { // $texte = ereg_replace("<p class[^>]*>", "<P>", $texte); //Translation des codes iso // PB avec l'utilisation de <code> // $trans = get_html_translation_table(HTML_ENTITIES); // $trans = array_flip($trans); $trans = get_html_translation_table(HTML_ENTITIES); $trans = array_flip($trans); $trans["<br />\n"] = "<BR>"; $trans["œ"] = "oe"; $trans["…"] = "..."; $trans["’"] = "'"; $trans["–"] = "-"; $trans["‘"] = "'"; $trans["“"] = "\""; $trans["”"] = "\""; $trans["&ucirc;"] = "û"; $texte = strtr($texte, $trans); // Echappement des " $texte = ereg_replace("\"", "\\\"", $texte); // Traitement des Espaces $texte = ereg_replace("(&nbsp;| )+", " ", $texte); return $texte; }
J'utilise SPIP pour générer les articles.

Peut-être que ces quelques précisions peuvent aider à résoudre mon souci.

Paul

Posté : 09 oct. 2005, 19:13
par Cyrano
Je comprends pas vraiment : On dirait que tu essayes de traiter la chaine d'url avec d'ajouter le nom de domaine éventuellement dedans: mais de la manière dont tu procèdes, je n'ai en fin de compte aucune idée de ce que ça donne.

Donne moi un exemple concret: un texte de base et le texte que tu veux obtenir à la sortie (pas deux pages, juste une ligne ou deux. Je crois que je commence à deviner, mais je veux une confirmation.

Posté : 09 oct. 2005, 20:00
par Paul
Ok je vais essayer de préparer ça mais c'est pas évident.

Merci,

Paul

Posté : 09 oct. 2005, 21:30
par Paul
En fait, je viens de tester ton code avec d'autres url et ça ne fonctionne plus :

Code : Tout sélectionner

<?php /* On part d'une chaine de caractère contenant des liens */ $lien_base = '<a href="Systemes-financiers-decentralises.html">Lien interne ne fonctionnant pas</a><br><a href="tutoriaux/index.php">Tutoriaux PHP France</a><br><a href="forums/index.php">Les forums de PHPFrance</a><br><a href="http://www.lumadis.be/regex/test_regex.php">une lien vers ailleurs</a>'; $masque = '#(<a\shref=")(\w*/)#'; $ajout = 'http://peupleso.1formatik.com/CIDR/'; $remplacement = '$1'.$ajout.'$2'; $nouvelle = preg_replace($masque, $remplacement, $lien_base); echo("<p>". $nouvelle ."</p>\n"); ?>
Exemple ici : http://peupleso.1formatik.com/CIDR/article_test.php

Qu'en penses-tu ?

Merci,
Paul

Posté : 09 oct. 2005, 22:14
par Cyrano
J'en pense que c'était sommaire. En affinant un peu on peu améliorer comme ceci:
<?php
/* On part d'une chaine de caractère contenant des liens */
$lien_base = '<a href="Systemes-financiers-decentralises.html">Lien interne ne fonctionnant pas</a><br>
<a href="tutoriaux/index.php">Tutoriaux PHP France</a><br>
<a href="forums/index.php">Les forums de PHPFrance</a><br>
<a href="www.phpfrance.com/forums/index.php">Les forums de PHPFrance</a><br>
<a href="http://www.lumadis.be/regex/test_regex.php">une lien vers ailleurs</a>';
$masque = '#(<a\shref=")(\w*/?[^(http:|www\.)])#i';
$ajout = 'http://www.phpfrance.com/';
$remplacement = '$1'.$ajout.'$2';
$nouvelle = preg_replace($masque, $remplacement, $lien_base);
echo("<p>". $nouvelle ."</p>\n");
?>
Tu noteras que j'ai même ajouté un autre lien de test.

Mais bon, c'est la phase test la plus difficile à réaliser correctement et il faut un jeu d'essai le plus varié possible. Il reste probablement des cas auxquels je ne pense pas dans l'immédiat qui ne fonctionneront peut-être pas non plus.

Par contre du coup, je ne comprends plus trop le lien avec ce que tu avais fait avec les caractères iso :-k

Posté : 09 oct. 2005, 22:57
par Paul
Merci beaucoup,

je vais tester ton code et vor s'il s'adapte dans mon cas.

Concernant le lien avec les caractères iso, je voulais juste transformer le code que tu m'as proposé pour l'insérer dans la fonction pdf_propre que je souhaite appliquer au texte juste avant la génération du PDF et faire un truc du genre :
<?php

function pdf_propre($texte) { 
    $trans = get_html_translation_table(HTML_ENTITIES); 
    $trans = array_flip($trans); 
    $trans["<br />\n"] = "<BR>"; 
    $trans["œ"] = "oe"; 
    $trans["…"] = "..."; 
    $trans["’"] = "'"; 
    $trans["–"] = "-"; 
    $trans["‘"] = "'"; 
    $trans["“"] = "\""; 
    $trans["”"] = "\""; 
    $trans["&ucirc;"] = "û";    
    $texte = strtr($texte, $trans); 
    $texte = ereg_replace("\"", "\\\"", $texte); 
    $texte = ereg_replace("(&nbsp;| )+", " ", $texte); 
  	
$masque = '#(<a\shref=")(\w*/?[^(http:|www\.)])#i'; 
$ajout = 'http://www.phpfrance.com/'; 
$remplacement = '$1'.$ajout.'$2'; 
$texte = preg_replace($masque, $remplacement, $texte);
  
    return $texte; 
}



$texte = '<a href="Systemes-financiers-decentralises.html">Lien interne ne fonctionnant pas</a><br> 
<a href="tutoriaux/index.php">Tutoriaux PHP France</a><br> 
<a href="forums/index.php">Les forums de PHPFrance</a><br> 
<a href="www.phpfrance.com/forums/index.php">Les forums de PHPFrance</a><br> 
<a href="http://www.lumadis.be/regex/test_regex.php">une lien vers ailleurs</a>'; 

$texte = pdf_propre($texte);

echo("<p>". $texte ."</p>\n");

?>
En fait c'est dans un fichier lorsque quelqu'un clique sur générer l'article au format pdf que les url doivent être absolues mais je dois aussi traiter le code html avant de générer le pdf, donc je voulais appliquer au texte une fonction qui fasse les deux.

Suis-je clair ?

Paul

Posté : 10 oct. 2005, 09:34
par mere-teresa
En fait c'est dans un fichier lorsque quelqu'un clique sur générer l'article au format pdf que les url doivent être absolues mais je dois aussi traiter le code html avant de générer le pdf, donc je voulais appliquer au texte une fonction qui fasse les deux.
Gni ? :-k

C'est pour une newsletter ?

Posté : 11 oct. 2005, 15:16
par Paul
Non, c'est pour générer un article en html au format pdf, je cherche de mon coté et vous tiendrai informé de mes avancées, s'il y en a.

Merci en tout de suivre le sujet et d'essayer de m'aider.

Paul