Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
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 28/01/2008, 19h38   #1
Membre habitué
 
Inscription : septembre 2004
Messages : 245
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 245
Points : 110
Points : 110
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é
omelhor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 19h39   #2
Membre habitué
 
Inscription : septembre 2004
Messages : 245
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 245
Points : 110
Points : 110
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 :
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 :
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 :
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 :
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
>>>
omelhor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 01h57   #3
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Je te conseille preg_replace_callback :

Code :
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 SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 10h08   #4
Membre habitué
 
Inscription : septembre 2004
Messages : 245
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 245
Points : 110
Points : 110
Citation:
Envoyé par Antoun Voir le message
Je te conseille preg_replace_callback :

Code :
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 :
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
<div style="margin:20px; margin-top:5px; ">
	<div class="smallfont" style="margin-bottom:2px">Citation:</div>
	<table cellpadding="6" cellspacing="0" border="0" width="100%">
	<tr>
		<td class="alt2" style="border:1px inset">
 
				<div style="margin:20px; margin-top:5px; ">
	<div class="smallfont" style="margin-bottom:2px">Citation:</div>
	<table cellpadding="6" cellspacing="0" border="0" width="100%">
	<tr>
		<td class="alt2" style="border:1px inset">
 
				<?
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);
?>
 
		</td>
	</tr>
	</table>
</div>
 
		</td>
	</tr>
	</table>
</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 ?
omelhor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 18h29   #5
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
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 :
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 :
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 SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 07h21   #6
Membre habitué
 
Inscription : septembre 2004
Messages : 245
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 245
Points : 110
Points : 110
Merci ça marche.
Merci aussi pour l'explixation.
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 12h50.


 
 
 
 
Partenaires

Hébergement Web