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 :

Recherche et remplacement de l'attribut d'une balise HTML [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Points : 267
    Points
    267
    Par défaut Recherche et remplacement de l'attribut d'une balise HTML
    Bonjour,

    Je suis complètement bloqué, j'arrive pas à voir comment faire.

    J'ai une chaîne de caractère dans un fichier :

    width="768"

    => mon but est de remplacer la valeur 768 par 500

    En sachant que :

    1)dans un premier temps je recherche si un width est présent,si oui je regarde sa valeur , ici 768
    2)je teste si sa valeur est supérieur à 500
    3)si valeur supérieur à 500, je la remplace par 500
    => donc ici je remplace 768 par 500
    et j'obtient width="500"


    Les recherches sur les chaînes de caractères c'est pas trop mon truc, je voit pas du tout comment faire..
    Est-ce que quelq'un peut m'aiguiller ?

    Merci.
    José

  2. #2
    Membre actif
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Points : 267
    Points
    267
    Par défaut
    J'ai à peu près réussi, ce que je voulais faire, mais il ne me remplace que la 1ere occurrence trouvée, comment faire pour que tout le fichier soit traité ?

    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
    $filename = "log/insert.sql"; //votre fichier texte
    $file = fopen($filename, "r");
    $sql = fread($file, filesize($filename));
    fclose($file);
     
    	if(ereg('bob=[0-9]*',$sql))
    	{
    		$match = array();
    		$pattern = '#[0-9]+#';
    			if(preg_match($pattern, $sql, $match))
    			{
     
    				if($match[0]>100)
    				{
    				$sql0 = ereg_replace($match[0], "100", $sql);
    				}
    				else
    				{
    				echo "pas bon";
    				}
    			}
    			else
    			{
    			echo "pas bon1";
    			}
    	}
    	else 
    	{
    		echo "pas bon2";
    		echo "<br>";
    	}
    $fichier= fopen("log/insert0.sql","w");
    fputs ($fichier,$sql0);
    fclose($fichier);

    Par défaut
    J'ai a peut près réussit, ce que je voulais faire, mais il ne me remplace que la 1ere occurrence trouvée, comment faire pour que tout le fichier soit traité ?

    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
    $filename = "log/insert.sql"; //votre fichier texte
    $file = fopen($filename, "r");
    $sql = fread($file, filesize($filename));
    fclose($file);
     
    	if(ereg('bob=[0-9]*',$sql))
    	{
    		$match = array();
    		$pattern = '#[0-9]+#';
    			if(preg_match($pattern, $sql, $match))
    			{
     
    				if($match[0]>100)
    				{
    				$sql0 = ereg_replace($match[0], "100", $sql);
    				}
    				else
    				{
    				echo "pas bon";
    				}
    			}
    			else
    			{
    			echo "pas bon1";
    			}
    	}
    	else 
    	{
    		echo "pas bon2";
    		echo "<br>";
    	}
    $fichier= fopen("log/insert0.sql","w");
    fputs ($fichier,$sql0);
    fclose($fichier);
    insert.sql :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <<<
    z
    bob=800
    ffezfze
    fzefzef
    ffffbob=1000
    fd
    dfz
    ef
    e
    fz
    efe
    f
    bob=1000
    >>>

    insert0.sql :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <<<
    z
    bob=500
    ffezfze
    fzefzef
    ffffbob=1000
    fd
    dfz
    ef
    e
    fz
    efe
    f
    bob=1000
    >>>

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Je te conseille preg_replace_callback :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function plafond($ma) {
      return 'bob=' .  max(100, (int) $ma[1]) ;
    }
     
    $filename = "log/insert.sql"; //votre fichier texte
    $file = fopen($filename, "r");
    $sql = fread($file, filesize($filename));
    fclose($file);
    $sql = preg_regplace('#bob=(\d+)#s', 'plafond', $sql) ;
    $fichier= fopen("log/insert0.sql","w");
    fputs ($fichier,$sql0);
    fclose($fichier);
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  4. #4
    Membre actif
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Points : 267
    Points
    267
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Je te conseille preg_replace_callback :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function plafond($ma) {
      return 'bob=' .  max(100, (int) $ma[1]) ;
    }
     
    $filename = "log/insert.sql"; //votre fichier texte
    $file = fopen($filename, "r");
    $sql = fread($file, filesize($filename));
    fclose($file);
    $sql = preg_regplace('#bob=(\d+)#s', 'plafond', $sql) ;
    $fichier= fopen("log/insert0.sql","w");
    fputs ($fichier,$sql0);
    fclose($fichier);
    Salut,

    Merci pour ton aide
    J'ai essayé ton code mais cela ne marche pas :

    contenu de insert.sql
    <<<
    z
    bob=800
    ffezfze
    fzefzef
    ffffbob=1000
    fd
    dfz
    ef
    e
    fz
    efe
    f
    bob=1000

    >>>

    Script éxécuté :

    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
    <div class="bbcode_container">
    	<div class="bbcode_quote">
    		<div class="quote_container">
    			<div class="bbcode_quote_container"></div>
     
    				<div class="bbcode_container">
    	<div class="bbcode_quote">
    		<div class="quote_container">
    			<div class="bbcode_quote_container"></div>
     
    				<?
    function plafond($ma) {
    	return 'bob=' .  max(100, (int) $ma[1]) ;
    }
     
    $filename = "log/insert.sql"; //votre fichier texte
    $file = fopen($filename, "r");
    $sql = fread($file, filesize($filename));
    echo $sql;
    echo "<br>1";
    fclose($file);
    $sql = preg_regplace_callback('#bob=(\d+)#s', 'plafond', $sql) ;
    echo $sql;
    echo "<br>2";
    $fichier= fopen("log/insert0.sql","w");
    fputs ($fichier,$sql);
    fclose($fichier);
    ?>
     
    		</div>
    	</div>
    </div>
     
    		</div>
    	</div>
    </div>
    Lors de l'éxécuation du script, voici ce que j'ai à l'écran:
    <<<
    z bob=800 ffezfze fzefzef ffffbob=1000 fd dfz ef e fz efe f bob=1000
    1
    >>>

    Le fichier insert0.sql reste vide

    Je comprend pas ce que le fonctionnement et ce que fait la fonction plafond ?

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Désolé, je me suis un peu emmêlé les pinceaux... en particulier, j'ai utilisé preg_replace au lieu de preg_replace_callback, et max au lieu de min.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function plafond($ma) {
      $num = min(100, (int) $ma[1]) ;
      return "bob=$num"   ;
    }
     
    $sql = preg_replace_callback('#bob=(\d+)#s', 'plafond', $sql) ;
    Comment ça marche : au lieu de faire le remplacement directement, preg_replace_callback envoie un tableau de matches à la fonction de callback, en l'occurence plafond.

    A chaque remplacement, la fonction plafond reçoit un tableau de matches, dont l'élément d'indice 0 contient l'ensemble de la sous-chaîne reconnue par la regex (par exemple bob=1000) et l'élément d'indice 1 ce qui a été capturé par la première (et unique) paire de parenthèses de la regex (par exemple, 1000).

    (int) $ma[1] convertit ce nombre (qui arrive sous forme de texte) en entier.
    min() plafonne ce nombre à 100 ; c'est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((int) $ma[1] > 100) { $num = 100 ;} else { $num = (int) $ma[1] ;}
    La fonction renvoie ensuite le texte qui doit remplacer ce qui a été reconnu.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  6. #6
    Membre actif
    Inscrit en
    Septembre 2004
    Messages
    450
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 450
    Points : 267
    Points
    267
    Par défaut
    Merci ça marche.
    Merci aussi pour l'explixation.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/12/2009, 13h59
  2. [RegEx] fonction d'ajout d'attribut dans une balise html
    Par the magic developer dans le forum Langage
    Réponses: 4
    Dernier message: 30/10/2008, 12h48
  3. Réponses: 4
    Dernier message: 08/04/2008, 18h11
  4. Réponses: 3
    Dernier message: 11/06/2007, 12h33
  5. Accès aux attributs d'une balise HTML
    Par tatou42 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/02/2006, 14h01

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