IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langage PHP Discussion :

Difficultés avec une expression réguliere [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre du Club

    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 51
    Points
    51
    Par défaut Difficultés avec une expression réguliere
    Bonjour tout le monde,

    Je viens vous demander un petit coup de main sur une expression reguliere qui sera pour vous très simple mais moi j'ai beau essayer d'y arriver c'est pas mon truc!

    Je dois parser un fichier html pour y rechercher la chaine de caractere %s et la remplacer par autre chose. Dans mon exemple ca sera ce brave TOTO.
    Ce code m'est utile afin d'y appliquer par la suite un vprintf. Enfin bref pour celà j'ai écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $squelette = ereg_replace("%[^s]","TOTO",$squelette);
    Mon problème c'est que celà transforme tous les
    width="20%"
    en
    width="20%

    Mais ca fonctionne quand même pour mes %s.


    merci de voter aide

  2. #2
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Et pourquoi pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $squellette = str_replace("%s", "TOTO", $squelette);

  3. #3
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    dans ce cas précis, tu peux utiliser la fonction printf() ou sprintf()

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $texte = "ma valeur est : %s";
    $mavar = "une valeur quelconque";
     
    $texte = sprintf( $texte, $mavar);
     
    echo $texte;

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    +1, utilise la fonction sprintf() qui est prévue pour cela.
    Au passage, concernant les regex, je te recommande d'éviter la norme POSIX au profit des PCRE : http://g-rossolini.developpez.com/tu...ns-regulieres/

  5. #5
    Membre du Club

    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 51
    Points
    51
    Par défaut
    Merci de vos réponses.


    Non je ne peux pas utiliser sprintf tout simplement car mon code à 2 fonctions: il affiche une vue schematique coté admin ET une vue réelle coté visiteur. Pour celà je dois utiliser la fonction vsprintf.

    Pour la petite histoire je fais un portail/salle d'arcade pour phpbb. Donc dans un premier temps je parses des modeles de structures en HTML où %s symbolise l'emplacement d'un bloc que je remplace par l'identifiant du bloc réel affiché.


    Ensuite en fonction de l'endroit où je me trouve soit il affiche le bloc, soit sa déscription.

    coté admin ca ressemble à ca :


    et coté visiteur ca donne ca :
    http://www.yep-yop.com/gf_arcade/arcade.php

    Le code qui me permet de faire ca c'est ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    	//
    	// assemble du squelette
    	// 
    	function assembler_squelette($sortie='direct')
    	{
    		global $db;
     
    		$squelette = '';
    		$liste_feuille= array();
     
    		$sql = 'SELECT modele, f.id_feuille, id_bloc, a.id_mod , nom  
    				FROM '. ARCADE_FEUILLE .' as f LEFT JOIN '. ARCADE_BLOCS .' as b 
    				ON f.id_feuille=b.id_feuille 
    				LEFT JOIN '. ARCADE_MODELE .' as m 
    				ON f.id_modele=m.id_modele 
    				LEFT JOIN '.ARCADE_MODS.' as a 
    				ON b.id_mod=a.id_mod 
    				WHERE id_squelette='.$this->id_squelette.' 
    				ORDER BY position ASC
    				';
    		if( !($result = $db->sql_query($sql)) )
    		{
    			message_die(GENERAL_ERROR, "Impossible d'obtenir des infos sur les feuilles", '', __LINE__, __FILE__, $sql); 
    		}
     
    		while ($row = $db->sql_fetchrow($result))
    		{
     
    			if (!in_array($row['id_feuille'],$liste_feuille))
    			{
     
    				$liste_feuille[] = $row['id_feuille'];
    				$squelette .= stripslashes($row['modele']);
    			}
    			if ($sortie == 'cache')
    			{
    				$this->liste_blocs[] = '{'.$row['nom'].'}';		
    				if ($row['nom'] != '') $this->liste_mods[] = $row['nom'];				
    			}else{
    				$this->liste_blocs[] = '%'.$row['id_bloc'].'%';			
    				$this->liste_mods[] = $row['id_mod'];	
    			}
     
     
     
    		}
    		$squelette = ereg_replace("%[^s]","percent",$squelette);
    		$squelette  = vsprintf($squelette,$this->liste_blocs);
    		$this->squelette = str_replace("percent","%",$squelette);
    		if ($sortie == 'cache') $this->squelette = str_replace("{}","",$this->squelette);
    	}
    L'ensemble est alors envoyé dans 2 fichiers qui me servent de cache :
    http://www.yep-yop.com/gf_arcade/arc...quelette_4.tpl qui me crée un fichier tpl dynamique

    et

    http://www.yep-yop.com/gf_arcade/arc...he/blocs_4.txt qui m'affiche la liste des blocs à charger.

    Voilà j'espere avoir été assez complet/concis dans mon explication afin que vous voyez ce que j'ai fais et pourquoi je l'ai fais.

  6. #6
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Dans ton pemier message tu dis vouloir remplacer %s par TOTO, or ton regexp dit "remplacer %X avec X différent de s", c'est pas pas logique

    Et puis le str_replace() n'est pas utile?

  7. #7
    Membre du Club

    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 51
    Points
    51
    Par défaut
    je suis en train de reprendre ce code que j'ai fais il y a un moment et je me rend compte que je vous ai dis une grosses connerie. Excusez moi


    Effectivement je veux pouvoir AVANT de parser les %s virer tous les sigles % afin que la fonction printf ne les parses pas!

    si on prend un exemple tout bete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <table><tr><td width="20%">%s</td></table>
    printf va aussi considérer 20% comme un marqueur.

  8. #8
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace("#%s#","TOTO", $chaine);
    ca va te remplacer tout les %s par TOTO dans ta chaine $chaine.

    Si ce n'est pas exactement cela que tu veux faire, donne nous un exemple de ce que tu veux faire.

  9. #9
    Membre du Club

    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 51
    Points
    51
    Par défaut
    je veux remplacer tous les caracteres % par autre chose SAUF les %s

    Ca pourrait donner ca :
    width="20%" => width="20TOTO"
    width=20% => width=20TOTO
    blablabla %s => blablabla %s
    %%s => TOTO%s

  10. #10
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace("#%([^s])#","#$1", $chaine);
    ca devrait marcher sans probleme !!

    tu y étais presque sauf qu'il fallait récupérer ce [^s] dans $1 et le remettre

    Voila !!

  11. #11
    Membre du Club

    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 51
    Points
    51
    Par défaut
    nickel Merci Mr Maxoo Je te mettrai dans les remerciements

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegExp] Difficulté avec une expression rrationnelle
    Par fleto dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/08/2010, 14h43
  2. [RegEx] Problème avec une expression réguliere
    Par figatelliSTI dans le forum Langage
    Réponses: 4
    Dernier message: 20/02/2008, 09h59
  3. [RegEx] Couper un mot avec une expression réguliere ?
    Par mLk92 dans le forum Langage
    Réponses: 4
    Dernier message: 24/08/2006, 09h34
  4. [RegEx] probleme avec une expression reguliere
    Par SharKeR dans le forum Langage
    Réponses: 9
    Dernier message: 07/04/2006, 16h50
  5. [VBA] difficultés avec une requête INSERT
    Par elias dans le forum Access
    Réponses: 7
    Dernier message: 06/09/2005, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo