Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/01/2011, 16h26   #1
Membre habitué
 
Inscription : septembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 244
Points : 110
Points : 110
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 :
preg_match_all('#<img.*?>#',$contents,$bob);
Ensuite je voudrais supprimer les images récupér dans $bob, mais cela ne marche pas

Code :
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 :
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
omelhor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2011, 17h02   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2011, 17h04   #3
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
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 :
$content = str_replace($bob[0][$i], '', $contents);
ou (comme tu l'as fait) dans $toto
Code :
$toto = str_replace($bob[0][$i], '', $contents);
si tu affectes la valeur de $toto à $contents avant la prochaine itération.
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2011, 21h11   #4
Membre habitué
 
Inscription : septembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 244
Points : 110
Points : 110
Merci l modification par
Code :
$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 :
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>
omelhor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2011, 21h23   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 :
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);
}
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 23h03   #6
Membre habitué
 
Inscription : septembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 244
Points : 110
Points : 110
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 ?

omelhor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2011, 23h22   #7
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
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.
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 00h30   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 :
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 ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 21h36   #9
Membre habitué
 
Inscription : septembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 244
Points : 110
Points : 110
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 :
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 :
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 ?
omelhor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 08h49   #10
Membre régulier
 
Inscription : juin 2004
Messages : 66
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 66
Points : 86
Points : 86
Attention "$bob[0][$i]" est évalué comme une expression régulière !

Imagine ce que donne :
Code :
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 :
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 :
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).
Blount est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 10h14   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 :
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);
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 19h55   #12
Membre habitué
 
Inscription : septembre 2004
Messages : 244
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 244
Points : 110
Points : 110
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 :
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 :
<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 !!!!!!!
omelhor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h49.


 
 
 
 
Partenaires

Hébergement Web