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 :

remplacement chaîne de caractère


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 remplacement chaîne de caractère
    Bonjour,

    J'ai le texte ci-dessous, où sous certaines conditions je voudrais supprimer les images

    Je les mais dans un 1er temps dans un tablea via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('#<img.*?>#',$contents,$bob);
    Ensuite je voudrais supprimer les images récupér dans $bob, mais cela ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    preg_match_all('#<img.*?>#',$contents,$bob);
    for($i=0;$i<count($bob[0]);$i++)
    	{
    	$photo = $bob[0][$i];
    	//si conditions a définir  
    	//exemple largeur image > 300px
    	//if(xxxxxxxxx)
    	//	{
    	$toto = preg_replace($bob[0][$i], '', $contents);
    	//	}
    	}
    texte :
    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
    $contents = "<p>*</p>','ddddddddddd','')'aaaaaaaaaaa','
    http://www.ffffffff.fr/20110104907/toto.php',
    20110104174901,'<p><img title=\"imagea\" alt=\"titrea\" src=\"http://www.ddddd.fr/images/stories/Articles/ddddddddddddddddddddddddddd.jpg\" width=\"229\" height=\"282\" />
     ffffffffffffffffff 
    <p><strong>Samedi 8 janvier</strong></p>
    <p>*</p>','ffffff.FR','')'fffffffffffff\'vvvvvvvvv et d\'aaaaaaaaa',
    'http://www.dddddddd.fr/ffffffffffffffff.html',20110109151900,'<div>
          ffffffffffffff\'fzefezfefezfe 
         </div>
         </div>
         <br/>','ddddddddddd.FR','''L\'ddddddddddddddd',
    	 'http://www.dddddddddddd.fr/L-ezdedeeez.html',20110108224700,'
    	 Ce samedi 08 janvier 2011,
    	 (4 à 2).     <div>
          <img src=\"http://www.ffffffff.fr/photo/art/default/fzezfefze.jpg\" alt=\"L\'ffff\" title=\"L\'ee\" />
         </div>
         <div>
           <br />
         <div>
          <img src=\"http://www.ferfer.fr/photo/art/default/ferfe.jpg\" alt=\"L\'Ar\" title=\"L\'Ar\" />
         </div>
         <div>";
    Savez-vous comment m'y prendre ?

    Merci beaucoup

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    ton expression n'est pas bonne, pour manipuler du html c'est avec DOMDocument, et pas la peine d'utiliser une boucle for pour parcourir un tableau foreach est la pour ca

  3. #3
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Dans la fonction preg_replace(), $bob[0][$i] sera considéré comme une chaine contenant un pattern devant être intérpreté par le moteur d'expressions rationnelles.

    Il faut donc utiliser la fonction str_replace().

    Normalement, le résultat doit se trouver dans $content
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $content = str_replace($bob[0][$i], '', $contents);
    ou (comme tu l'as fait) dans $toto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $toto = str_replace($bob[0][$i], '', $contents);
    si tu affectes la valeur de $toto à $contents avant la prochaine itération.

  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
    Merci l modification par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $content = str_replace($bob[0][$i], '', $contents);
    à marcher !!!

    Par contre est-ce que quelqu'un pourrait me confirmer que mon expression reguliere est bonne, stealh35 me fait douter.
    En tout cas la capture semble bien se faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <pre>Array
    (
        [0] => Array
            (
                [0] => <img title="imagea" alt="titrea" src="http://www.ddddd.fr/images/stories/Articles/ddddddddddddddddddddddddddd.jpg" width="229" height="282" /> 
                [1] => <img src="http://www.ffffffff.fr/photo/art/default/fzezfefze.jpg" alt="L\'ffff" title="L\'ee" /> 
                [2] => <img src="http://www.ferfer.fr/photo/art/default/ferfe.jpg" alt="L\'Ar" title="L\'Ar" /> 
            )
     
    )
    </pre>

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    non enfaite c'etait bon par contre la methode n'est pas la bonne tu complique les chose avec les regex, DOMDocument est la pour ca

    si tu veux supprimer les images d'une source html c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $doc = new DOMDocument();
    $doc->loadHTML($contents);
     
    $xpath = new DOMXPath($doc);
    $images = $xpath->query('//img');
     
    foreach($images as $image)
    {
        $image->parentNode->removeChild($image);
    }

  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
    J'ai testé la solution "dom", mais cela ne marche pas dans mon cas, je traite un fichier texte que j'ai généré moi même, rien a voir avec une page dom

    le problème c'est que veut pas systématiquement supprimer les images.
    Mon but est de les récupérer dans un tableau, afin de contrôler leur largeur.
    Si largeur supérieur à X , alors je supprime.

    Est-ce qu'avec cette expression je capture systématiquement toutes les images présentent dans un document ?


  7. #7
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    En fait, il est préférable d'ajouter l'option i...
    Afin de prendre en compte les éventuelles balises où la nom de la balise img serait partiellement ou totalement écrit en majuscules.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par omelhor Voir le message
    J'ai testé la solution "dom", mais cela ne marche pas dans mon cas, je traite un fichier texte que j'ai généré moi même, rien a voir avec une page dom

    le problème c'est que veut pas systématiquement supprimer les images.
    Mon but est de les récupérer dans un tableau, afin de contrôler leur largeur.
    Si largeur supérieur à X , alors je supprime.

    Est-ce qu'avec cette expression je capture systématiquement toutes les images présentent dans un document ?

    pourtant tu traites du html, donc c'est bien DOMDocument qu'il faut utilisé et pas les bidouilles de preg, surtout qu'au delà de recuperer les image tu va galère a supprimer les balises, si tu veux contrôler la dimension fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach($images as $image)
    {
        $sizes = getimagesize($image->getAttribute('src'));
     
        if($sizes[0] > 50)
        {
            $image->parentNode->removeChild($image);
        }
    }
    quand tu dis : mais cela ne marche pas
    qu'est ce qui marche pas ? y'a un message d'erreur ?

  9. #9
    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 stealth35 Voir le message
    pourtant tu traites du html, donc c'est bien DOMDocument qu'il faut utilisé et pas les bidouilles de preg, surtout qu'au delà de recuperer les image tu va galère a supprimer les balises, si tu veux contrôler la dimension fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach($images as $image)
    {
        $sizes = getimagesize($image->getAttribute('src'));
     
        if($sizes[0] > 50)
        {
            $image->parentNode->removeChild($image);
        }
    }
    quand tu dis : mais cela ne marche pas
    qu'est ce qui marche pas ? y'a un message d'erreur ?

    Ca va être plus simple avec un exemple concret :

    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
    <?php
     
    $contents = "'INSERT INTO toto(title,url,timestamp,contents,author,image) VALUES('toto - Rennes : Les observations de mi-saison','http://www.fcgb.net/?q=girondins-de-toto-2010/12/15/les-notes-fcgbnet-toto-rennes',20101215172720,'<p align=\"justify\"><img width=\"220\" height=\"163\" align=\"right\"
    src=\"http://www.aja.fr/siteofficiel/images/news/2009_Defaut_08Small.jpg\" /><br/>A l\'occasion du match de Ligue 1, Stade Malherbe de Caen / AJ Auxerre, les groupes de supporters organisent un déplacement.^M
    <br/>[...] <i>Cliquez sur le lien pour lire l\'article complet</i>','AJA.FR','')ZXYK;INSERT INTO auxerre(title,url,timestamp,contents,author,image) VALUES('Trois rendez-vous importants fin janvier, l\'AJA aura besoin du soutien de ses supporters','http://www.aja.fr/siteofficiel/article.asp?NUM=4261',20110110010000,'<img src=\"http://www.aja.fr/siteofficiel/images/news/2009_Defaut_14Small.jpg\" /><br/>Cette fin de mois de janvier 2011 s\'annonce importante pour les Auxerrois et leurs supporters ;^M
    <br/>[...] <i>Cliquez sur le lien pour lire l\'article complet</i>','AJA.FR','')ZXYK;INSERT INTO auxerre(title,url,timestamp,contents,author,image) VALUES('AJA/OM en vente sur Digitick, TicketNet et France Billet','http://www.aja.fr/siteofficiel/article.asp?NUM=4252',20110109010000,'<img src=\"http://www.aja.fr/siteofficiel/images/news/2009_Defaut_13Small.jpg\" /><br/>Afin de répondre Ã|  une trÚs forte demande et de désengorger les lignes téléphoniques, les places pour la demi-finale de la Coupe de la Ligue, AJA/OM,^M
    ';i";
     
    $doc = new DOMDocument();
    $doc->loadHTML($contents);
     
    $xpath = new DOMXPath($doc);
    $images = $xpath->query('//img');
     
      foreach($images as $image)
      {
          $sizes = getimagesize($image->getAttribute('src'));
          print_r($images);
          echo $sizes;
          //$image->parentNode->removeChild($image);
      }
    ?>
     
     
     
     
    /usr/local/php5/bin/php test2.php
    X-Powered-By: PHP/5.2.5-pl1-gentoo
    Content-type: text/html
     
    DOMNodeList Object
    (
    )
    DOMNodeList Object
    (
    )
    ArrayDOMNodeList Object
    (
    )
    ArrayDOMNodeList Object
    (
    )
    Array

    Si cela marchait, cela ne devrait t'il pas me renvoyer les caractèristiques des images et leur taille ?

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 207
    Points
    207
    Par défaut
    Attention "$bob[0][$i]" est évalué comme une expression régulière !

    Imagine ce que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace("<img title=\"imagea\" alt=\"titrea\" src=\"http://www.ddddd.fr/images/stories/Articles/ddddddddddddddddddddddddddd.jpg\" width=\"229\" height=\"282\" />", '', $contents);
    Les délimiteurs d'expression ne sont pas présent en plus.

    Bref, pas étonnant que cela ne fonctionne pas.
    Quand tu utilises une variable en tant qu'expression, pense à utiliser preg_quote afin d'échapper tous les caractères d'expression.
    Ceci devrait probablement fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace('#'.preg_quote($bob[0][$i]).'#', '', $contents);
    Mais ce code est "idiot", "$bob[0][$i]" contient une chaîne fixe, alors inutile d'utiliser un "preg_match" pour ça, un simple str_replace suffit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    preg_match_all('#<img.*?>#',$contents,$bob);
    for($i=0;$i<count($bob[0]);$i++)
    	{
    	$photo = $bob[0][$i];
    	//si conditions a définir  
    	//exemple largeur image > 300px
    	//if(xxxxxxxxx)
    	//	{
    	$toto = str_replace($bob[0][$i], '', $contents);
    	//	}
    	}
    Par contre, le nouveau contenu sera dans $toto (je ne sais pas si c'est normal).

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    donc la si tu veux faire du propre, tu fais un petit table du sqlite ca devrait allé en temporaire, tu fais des requêtes sur tes champs HTML et tu récupères le DOM, tu supprimes les images tu fais un update, ensuite un dump final

    sinon en mode bidouille c'est avec 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
    13
    14
    15
    16
    17
    18
    19
    20
    $contents = "'INSERT INTO toto(title,url,timestamp,contents,author,image) VALUES('toto - Rennes : Les observations de mi-saison','http://www.fcgb.net/?q=girondins-de-toto-2010/12/15/les-notes-fcgbnet-toto-rennes',20101215172720,'<p align=\"justify\"><img width=\"220\" height=\"163\" align=\"right\"
    src=\"http://www.aja.fr/siteofficiel/images/news/2009_Defaut_08Small.jpg\" /><br/>A l\'occasion du match de Ligue 1, Stade Malherbe de Caen / AJ Auxerre, les groupes de supporters organisent un déplacement.^M
    <br/>[...] <i>Cliquez sur le lien pour lire l\'article complet</i>','AJA.FR','')ZXYK;INSERT INTO auxerre(title,url,timestamp,contents,author,image) VALUES('Trois rendez-vous importants fin janvier, l\'AJA aura besoin du soutien de ses supporters','http://www.aja.fr/siteofficiel/article.asp?NUM=4261',20110110010000,'<img src=\"http://www.aja.fr/siteofficiel/images/news/2009_Defaut_14Small.jpg\" /><br/>Cette fin de mois de janvier 2011 s\'annonce importante pour les Auxerrois et leurs supporters ;^M
    <br/>[...] <i>Cliquez sur le lien pour lire l\'article complet</i>','AJA.FR','')ZXYK;INSERT INTO auxerre(title,url,timestamp,contents,author,image) VALUES('AJA/OM en vente sur Digitick, TicketNet et France Billet','http://www.aja.fr/siteofficiel/article.asp?NUM=4252',20110109010000,'<img src=\"http://www.aja.fr/siteofficiel/images/news/2009_Defaut_13Small.jpg\" /><br/>Afin de répondre Ã|  une trÚs forte demande et de désengorger les lignes téléphoniques, les places pour la demi-finale de la Coupe de la Ligue, AJA/OM,^M
    ';i";
     
    function test($value)
    {
        $url = stripcslashes($value['url']);
        $sizes = getimagesize($url);
     
        if($sizes[0] > 500)
        {
            return '';
        }
     
        return $value[0];
    }
     
    echo preg_replace_callback('/<img[^>]*src=\"(?P<url>.*?)\"[^>]*>/i', 'test', $contents);

  12. #12
    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 stealth35 Voir le message
    donc la si tu veux faire du propre, tu fais un petit table du sqlite ca devrait allé en temporaire, tu fais des requêtes sur tes champs HTML et tu récupères le DOM, tu supprimes les images tu fais un update, ensuite un dump final

    sinon en mode bidouille c'est avec 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
    13
    14
    15
    16
    17
    18
    19
    20
    $contents = "'INSERT INTO toto(title,url,timestamp,contents,author,image) VALUES('toto - Rennes : Les observations de mi-saison','http://www.fcgb.net/?q=girondins-de-toto-2010/12/15/les-notes-fcgbnet-toto-rennes',20101215172720,'<p align=\"justify\"><img width=\"220\" height=\"163\" align=\"right\"
    src=\"http://www.aja.fr/siteofficiel/images/news/2009_Defaut_08Small.jpg\" /><br/>A l\'occasion du match de Ligue 1, Stade Malherbe de Caen / AJ Auxerre, les groupes de supporters organisent un déplacement.^M
    <br/>[...] <i>Cliquez sur le lien pour lire l\'article complet</i>','AJA.FR','')ZXYK;INSERT INTO auxerre(title,url,timestamp,contents,author,image) VALUES('Trois rendez-vous importants fin janvier, l\'AJA aura besoin du soutien de ses supporters','http://www.aja.fr/siteofficiel/article.asp?NUM=4261',20110110010000,'<img src=\"http://www.aja.fr/siteofficiel/images/news/2009_Defaut_14Small.jpg\" /><br/>Cette fin de mois de janvier 2011 s\'annonce importante pour les Auxerrois et leurs supporters ;^M
    <br/>[...] <i>Cliquez sur le lien pour lire l\'article complet</i>','AJA.FR','')ZXYK;INSERT INTO auxerre(title,url,timestamp,contents,author,image) VALUES('AJA/OM en vente sur Digitick, TicketNet et France Billet','http://www.aja.fr/siteofficiel/article.asp?NUM=4252',20110109010000,'<img src=\"http://www.aja.fr/siteofficiel/images/news/2009_Defaut_13Small.jpg\" /><br/>Afin de répondre Ã|  une trÚs forte demande et de désengorger les lignes téléphoniques, les places pour la demi-finale de la Coupe de la Ligue, AJA/OM,^M
    ';i";
     
    function test($value)
    {
        $url = stripcslashes($value['url']);
        $sizes = getimagesize($url);
     
        if($sizes[0] > 500)
        {
            return '';
        }
     
        return $value[0];
    }
     
    echo preg_replace_callback('/<img[^>]*src=\"(?P<url>.*?)\"[^>]*>/i', 'test', $contents);
    Merci beaucoup, "le mode bidouille marche", je vais déjà essayer de compendre comment ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img[^>]*src=\"(?P<url>.*?)\"[^>]*>
    J'avoue avoir du mal a comprendre l'expression reguliere
    Si la decoupe :

    <img => chaine débutant par <img
    \" => je protège le guillemet
    [^>]* => cela signifie n'importe quel caractere ne se terminant pas par ">" ???
    (?P<url>.*?) => la je comprend rien !!!!!!!

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

Discussions similaires

  1. [MySQL] Remplacer une chaîne de caractères dans une base de données
    Par Furius dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 27/11/2013, 22h06
  2. Rechercher et remplacer chaîne de caractères
    Par ponpon17430 dans le forum VBScript
    Réponses: 2
    Dernier message: 06/03/2012, 15h10
  3. Remplacement chaîne de caractère
    Par RéviAT dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 17/01/2008, 11h56
  4. Remplacer chaînes de caractères au moment de la compilation
    Par profilien dans le forum Mise en forme
    Réponses: 2
    Dernier message: 01/09/2007, 18h06
  5. Remplacer une chaîne de caractères dans une base
    Par Furius dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/10/2005, 00h03

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