Rechercher et remplacer expressions dans une page [Résolu]

Signaler
Messages postés
140
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
20 août 2012
-
Messages postés
140
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
20 août 2012
-
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

Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
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 -
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
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 -
Messages postés
140
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
20 août 2012

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
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
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 -
Messages postés
140
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
20 août 2012

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
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
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 -
Messages postés
140
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
20 août 2012

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
Messages postés
140
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
20 août 2012

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
Messages postés
140
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
20 août 2012

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
Messages postés
140
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
20 août 2012

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
Messages postés
140
Date d'inscription
mardi 3 juin 2003
Statut
Membre
Dernière intervention
20 août 2012

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