Rechercher et remplacer expressions dans une page

Résolu
cs_hdh Messages postés 140 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 20 août 2012 - 25 nov. 2009 à 18:29
cs_hdh Messages postés 140 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 20 août 2012 - 11 févr. 2010 à 18:32
Bonjour,
du fait qu'il ne me reste plus de cheveux à m'arracher je me tourne vers vous avec mon problème ;-)

je fais un script qui
1 - lit le une page html (stockée en dure sur mon ftp)(ça ca va)
2 - je voudrais parser le corps de cette page pour y remplacer certaines strings et remplacer par d'autre.(ça ca va pas)
3- écriture d'une nouvelle page avec le contenu mis à jour (ça ca va)

le truc c'est que j'arrive pas à trouver une boucle qui remplace correctement mes expressions (probablement utiliser des expressions régulières)??

Les expressions à remplacer sont de deux types dans la page html
a-
#civ#
que je voudrais remplacer par
<? print civ; ?>


b-
#tt:civ#
que je voudrais remplacer par
<? civ(); ?>

(cette expression est reconnaisable avec son ":" )

Auriez-vous des tuyaux (à défaut de cheveux à replanter ??)
D'avance merci pour votre aide !!
H


le temps n'épargne pas ce que l'ont fait sans lui.. le php non plus

11 réponses

kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
30 nov. 2009 à 20:30
Re Hdh,

Ca y est, t'es totalement chauve ?

Je ne suis pas certain que tu retiennes la meilleure solution. Peut être en existe t il une plus simple, mais toi seul peux le savoir.

Pour m'en tenir à ton problème, quelque chose comme ça devrait faire l'affaire :
<?php
function replace($m) {
    $m[1] = str_replace('content:', 'content_', $m[1]);
    global ${$m[1]};
    return ${$m[1]};
}
$sPattern = '`#([^#]*)#`';
$u = preg_replace_callback($sPattern, 'replace', $t);
?>


En espérant que ça puisse t'aider.

Bonne soirée,



Kohntark -
3
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
26 nov. 2009 à 08:31
Salut,

Un simple str_replace ne suffit pas ??

Et :
- le tag d'ouverture php s'écrit <?php (et pas <?)
- "<? print civ; ?>" civ est une constante ?

Cordialement,


Kohntark -
0
cs_hdh Messages postés 140 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 20 août 2012
26 nov. 2009 à 09:22
je ne pense pas que cela me convienne, mais bon suis pas certain, en effet
- il peut y avoir plusieurs occurences de #civ# dans ma page
- je voudrais à terme utiliser une fonction avec une expression régulière pour pouvoir remplacer automatiquement tous les #xxxx# par des <?php print $xxxx; ?>, les #yyyy# par des <?php print $yyy; ?>

Je suis tout à fait à l'écoute : si tu as des conseils (ou carrément des sources) je suis preneur !!

au plaisir de te (vous)lire !!
H


le temps n'épargne pas ce que l'ont fait sans lui.. le php non plus
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
26 nov. 2009 à 11:54
Je suis tout à fait à l'écoute : si tu as des conseils (ou carrément des sources) je suis preneur !!

=> str_replace() !!
Si tu n'as que ces remplacements à faire c'est totalement inutile de passer par des expressions régulières, même la fonction n'est pas utile si tu n'as pas besoin de traiter 20 fichiers.
Une seule ligne suffit.


Cordialement,

Kohntark -
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_hdh Messages postés 140 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 20 août 2012
26 nov. 2009 à 16:10
Hello,
ca m'a l'air un peu plus complexe :-/
1- Il faut que je parse le fichier html et détecte toutes les balises commencant et finissant par un dièse
>> exemple #civ# mais aussi #tutuu#.... je ne saurais pas à l'avance quelles seront ces balises c'est pour cela que je voudrais faire quelquechose de dynamique

2- une fois que j'ai trouvé les balises il me faut récupérer la string entre les dièses et la transformer en variable php
>> exemple si on a trouvé la balise #civ# on remplace par $civ
>> exemple si on a trouvé la balise #tuututu# on remplace par $tuututu

c'est vraiment une nécessité de travailler avec une boucle je pense... et mon truc pr l'instant de détection de balise ne fonctionne pas

if(preg_match("'\#libcivilite\#'", $chaine)) 	// fonctionne
//if(preg_match("'\#[:alnum:]\#'", $chaine))				// fonctionne pas
     {
 echo 'On a au moins une expression du type #ChaineChiffresLettres#'; 
 }
else { echo 'On a pas une expression de ce type';} 



le temps n'épargne pas ce que l'ont fait sans lui.. le php non plus
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
26 nov. 2009 à 18:49
Je mets du temps à comprendre, et tu mets du temps à bien expliquer

C'est plus clair maintenant.
Si je m'en tiens pile poil a tes exemples nul besoin de faire une boucle, un preg_replace suffit :
<?php
preg_replace('`#([^#]*)#`', '$\1', $t);
?>


Bien sur si les exemples de ton premier message (#tt:xxx#, civ()) sont toujours valables il faudra modifier le code. Je te laisse cette modif, n'hésite pas à reposter si tu rencontres des problèmes.

Cordialement,

Kohntark -
0
cs_hdh Messages postés 140 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 20 août 2012
27 nov. 2009 à 10:19
Hello,
Oula la la je n'ai jamais été aussi proche :-) merci pour ton aide !!
Néanmoins cela n'est pas encore parfait : l'interpretation des variables n'est pas affichées..
Je voudrais en effet obtenir 'Bonjour Madame Dupont, comment ça va ? ' alors que cela affiche 'Bonjour $libcivilite $nom, $content_question'
(comme tu pourras le remarquer plutot que de passer par une fonction pour les #content:xxxxxxxx# je passe finalement par une variable.) cela ne change rien au dev ci-dessous.

Pourrais-tu me dire comment faire afficher le contenu de ma variable plutot que le nom de la variable ?

d'avance grand merci pour ton aide !


$libcivilite="Madame";
$nom="Dupont";
$content_question = "comment ca va ?";

$t = 'Bonjour #libcivilite# #nom#, #content:question#';
$u = preg_replace('`#([^#]*)#`', '$\1', $t);
$t = str_replace('content:', 'content_', $u);

print "<hr>".$t."<hr>";
// je voudrais obtenir 'Bonjour Madame Dupont, comment ça va ? '
// alors que cela affiche 'Bonjour $libcivilite $nom, $content_question'  


le temps n'épargne pas ce que l'ont fait sans lui.. le php non plus
0
cs_hdh Messages postés 140 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 20 août 2012
29 nov. 2009 à 23:02
Heeeeeeeeeelp :-)
J'ai tenté de contourner la difficulté ce we mais cette solution semble la plus intéressante.. mais je scotsh lamentablement.. un brin d'aide de développeur me permettrait d'avancer...
y aurait il une âme charitable .. un Kohntark par exemple ???
Au plaisir de vous lire !!
H


le temps n'épargne pas ce que l'ont fait sans lui.. le php non plus
0
cs_hdh Messages postés 140 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 20 août 2012
2 déc. 2009 à 00:20
Hello,
Je te remercie pour ton aide sur ce soucis : les cheveux repoussent !!
J'ai changé un brin le code que tu proposais pour l'adapter à ma problématique : ca fonctionne tiptop, je vais pouvoir continuer à avancer sur mon projet !
function replaceVar($m) {
    $m[1] = str_replace(':', '_', $m[1]);
    global ${$m[1]};
    return ${$m[1]};
}
$sPatternVar = '`#([^#][a-zA-Z0-9_:]*)#`';
$body1 = preg_replace_callback($sPatternVar, 'replaceVar', $body);

Encore merci pour ton aide et ta patience :-)
H

le temps n'épargne pas ce que l'ont fait sans lui.. le php non plus
0
cs_hdh Messages postés 140 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 20 août 2012
16 déc. 2009 à 18:07
Hello
Je suis encore en train d'améliorer mon code : je voudrais maintenant qu'à chaque remplacement il me rajoute un autoincrement en plus
exemple
si dans mon code il y a ces lignes
#nom#
#prenom#
#age#

suite au passage de la boucle infernale décrite ci-dessus je voudrais obtenir le code suivant (c'est à dire ajouter '?id=xx' où xx est un autoincremental)

#nom?id=1#
#prenom?id=2#
#age?id=3#


du fait que ce soit une expression régulière je suis perdu de chez perdu : zauriez pas une baguette magique qui traine ou des conseils ?

d'avance grand merci pour votre aide :-)

H



le temps n'épargne pas ce que l'ont fait sans lui.. le php non plus
0
cs_hdh Messages postés 140 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 20 août 2012
11 févr. 2010 à 18:32
Bonjour
Dans le mm style je suis bloqué sur une fonction qui me permettrait de transformer les liens erlatifs de mes images en liens absolus (la racine d'url des lien absolus est toujours la même (du type http://www.google.fr/)), par contre le dossier d'images lui peut avoir un nom qui varie. (mais ne pas modifier les urls déjà en absolu)
Mon problème est que suivant le code html des pages on peut avoir des quotes, doubles quotes ou rien du tout pour encadrer l'url des images (ex
 ou 
)
Ce que je cherche à faire c'est obtenir
 ou 


Pourriez vous me donner un coup de main pour gérer ce truc qui me dépasse un peu...
au plaisir de vous lire...

H

le temps n'épargne pas ce que l'ont fait sans lui.. le php non plus
0