Modification de lignes d'un document avec explode, preg_repl

Invité
Invité n'ayant pas de compte PHPfrance

26 janv. 2011, 21:10

Bonjour,

Je veux modifier certaines lignes d'un document.

Voici le code d'essai sur lequel je bute :

/* Découpage du document en lignes */
$lignes_document = explode("\n", $document);

/* Analyse de chaque ligne */
foreach ($lignes_document as $ligne)

{
	$ligne = preg_replace("/BWP/", "BWPP", $ligne);
	echo $ligne;	
}

print_r($lignes_document);
$document = implode("\n", $lignes_document);

L'instruction echo affiche bien les lignes modifiées.

Par contre, $lignes_document (et par voie de conséquence $document) reste inchangé !

Je comprends d'autant moins que j'ai déjà utilisé cette technique et qu'elle marchait.

Quelqu'un peut-il m'aider à me débloquer ?

Grand merci d'avance

Eléphanteau du PHP | 37 Messages

26 janv. 2011, 21:17

Rebonjour,

J'avais oublié de me connecter, d'où le "Invité".

Bosyphe

ViPHP
ViPHP | 3607 Messages

26 janv. 2011, 22:54

Bonsoir,

Il y a un problème majeur dans ton code...
// contenu d'origine
$lignes_document = $document;

foreach ($lignes_document as $ligne)
{
        // initilisation de la variable $ligne
        $ligne = preg_replace("/BWP/", "BWPP", $ligne);
}

// on remet à la place du contenu d'origine.... le contenu d'origne!
$document = implode("\n", $lignes_document);
A aucun moment, tu n'indiques que $ligne doit remplacer quelque chose...

D'autres petits détails:
-Pour le traitement que tu montres, str_replace(à suffit amplement et est bien plus adapté/rapide, que preg_replace()
-Pour lire un fichier dans un tableau directement, il existe la fonctione file() : http://fr2.php.net/manual/fr/function.file.php

Bon courage ;)

ViPHP
ViPHP | 2577 Messages

27 janv. 2011, 15:59

Bonjour,

Pourquoi ne pas faire un $document = preg_replace("/BWP/", "BWPP", $document ); ? (hors pb de str_replace)

=> Pas d'explode, ni de foreach et d'implode.

Eléphanteau du PHP | 37 Messages

28 janv. 2011, 16:17

Bonsoir,

Il y a un problème majeur dans ton code...
// contenu d'origine
$lignes_document = $document;

foreach ($lignes_document as $ligne)
{
        // initilisation de la variable $ligne
        $ligne = preg_replace("/BWP/", "BWPP", $ligne);
}

// on remet à la place du contenu d'origine.... le contenu d'origne!
$document = implode("\n", $lignes_document);
A aucun moment, tu n'indiques que $ligne doit remplacer quelque chose...

D'autres petits détails:
-Pour le traitement que tu montres, str_replace(à suffit amplement et est bien plus adapté/rapide, que preg_replace()
-Pour lire un fichier dans un tableau directement, il existe la fonctione file() : http://fr2.php.net/manual/fr/function.file.php

Bon courage ;)

Merci de ta réponse et excuse-moi de n'avoir pas répondu rapidement.

Tout d'abord, j'ai présenté ici un code volontairement très simplifié. Le traitement réel consiste à analyser un texte xhml (dans lequel se trouve pour l'instant le code php) en y modifiant et en y complétant le contenu de certaines balises, contenu que je ne connais bien évidemment pas a priori. La fonction preg_replace est donc nécessaire ici pour remplacer des contenus de balise déterminés à l'aide d'expressions régulières. (J'ai utilisé la chaîne "BWP" pour faire des essais car elle est facilement identifiable dans le document que je traite, étant présente dans le premier titre. Je peux ainsi savoir rapidement quel résultat donne tel ou tel essai.)

Effectivement, je comprends la distinction subtile entre variable et image de cette variable.
Lorsque j'écris
$ligne = preg_replace("/BWP/", "BWPP", $ligne);
j'affecte une valeur à l'image de la variable $ligne extraite du tableau $lignes_document. Mais le contenu du tableau n'est pas modifié. Piège !..

Ne voulant pas travailler avec des indices dans tout mon programme (de type $lignes_document[$i] ), et après une petite dose de recherche et de compréhension, j'ai très simplement résolu le problème en utilisant l'opérateur de référence & :
foreach ($lignes_document as & $ligne) // opérateur & placé ici
{
	$ligne = & preg_replace("/AWP/", "AWPP", $ligne);
}

Tout le reste de mon programme reste donc inchangé. Voila un seul caractère très rentable :)

Merci de vos interventions.

ViPHP
ViPHP | 5462 Messages

28 janv. 2011, 16:24

tu sais que ton preg_replace sert a rien dans ton cas, que str_replace suffis, et que tu le faire sur le document direct...

Eléphanteau du PHP | 37 Messages

29 janv. 2011, 11:19

Oui effectivement,

J'ai donc remplacé les preg_replace par str_replace dans la mesure où l'expression à remplacer est dans chaque cas déterminée en amont à l'aide d'instructions preg_match.

Merci du conseil

Administrateur PHPfrance
Administrateur PHPfrance | 149 Messages

29 janv. 2011, 11:49

normal,
foreach ($lignes_document as $ligne)
lire : http://php.net/manual/fr/control-structures.foreach.php
Note:
A moins que le tableau soit une référence, foreach opère sur une copie des valeurs du tableau spécifié et non sur les valeurs elles-mêmes. foreach affecte le pointeur interne du tableau.
--
Moosh - ancêtre de la communauté
http://www.phpfrance.com