Extraction d'une partie d'un fichier texte

Petit nouveau ! | 2 Messages

19 oct. 2007, 11:08

Bonjour à tous.

Tout d'abord désolé pour ce titre si peu explicite mais je ne sais pas comment présenter clairement mon problème en une simple ligne...je ne suis qu'un pauvre débutant qui a du mal à mettre des mots sur les choses en php.

Ce que je cherche à faire :

Créer une fonction qui affiche une partie d'un script existant. Ce dit script se structure de la sorte : <?php "contenu1 "<mabalise>"contenu2"</mabalise>"contenu3" ?>. Je veux donc que ma fonction n'affiche que le "contenu2" de mon script, situé entre les 2 bornes de ma balise <mabalise>.

J'ai pour le moment réussi à faire arréter mon affichage au bon endroit mais pas à le faire démarrer là où je le souhaite. En gros j'en suis au stade où ma fonction m'affiche "contenu1 "<mabalise>"contenu2"</mabalise>"(exit "contenu3"...c'est déja un bon début) mais je souhaite n'avoir que <mabalise>"contenu2"</mabalise>"

Je serai très reconnaissant envers la personne qui pourra éclairer ma lanterne de noob sur comment faire pour démarrer à <mabalise> et ne pas afficher tout ce qu'il y a avant.

Voici mon code :
function DisplayService ($MyfpM) {

	while(!feof($MyfpM)) {	
		$line = fgets($MyfpM,4096);	
		echo($line);
		if ($line == "</mabalise>\r\n") {
			break;
		}
		
	}
	fclose($MyfpMixad);
}
Merci d'avance.

d0m
Mammouth du PHP | 1141 Messages

19 oct. 2007, 11:19

tu peux utiliser les fonctions de chaines de caractère, par exemple strpos pour trouver la place de ta balise
et ensuite substr pour la sous chaine.

Sinon, les expressions régulières....

Petit nouveau ! | 2 Messages

19 oct. 2007, 11:28

Retrouver <mabalise> ne me pose pas trop de difficulté à vrai dire. Ce qui me pose problème c'est de commencer à afficher le contenu de ma boucle uniquement à partir de <mabalise>.

On peut diviser ça en différentes étapes :
1-je boucle sans afficher
2-je trouve <mabalise>
3-je continue à boucler mais j'affiche à partir de <mabalise>
4-je trouve </mabalise>
5-j'arrette de boucler

Les étapes 1,2,4 et 5 ne sont pas un soucis...là où je bloque c'est sur l'étape 3 : boucler et afficher à partir d'un point donné que j'ai au préalable identifié (et non pas l'identification de ce point). Je me suis mal exprimé sur l'exposition de mon problème :) ...désolé.

Peut-être que l'utilisation d'un booléen peut aider...mais je dois avouer ne pas du tout savoir comment utiliser ça à cet effet... :?

d0m
Mammouth du PHP | 1141 Messages

19 oct. 2007, 13:07

on dirait que ton script pour extraire les données du fichier suit certaines règles.
Tu as donc une structure de fichier à respecter? Pourrais tu donner le modèle du fichier
(ex : <mabalise> et </mabalise> toujours en début de ligne,...)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 oct. 2007, 13:07

Tout d'abord désolé pour ce titre si peu explicite mais je ne sais pas comment présenter clairement mon problème en une simple ligne
:-* Pas plus difficile que ça :wink:

Regarde du coté des expression régulières ou preg_match()
preg_match('#<mabalise>(.*)</mabalise>#',$texte,$ret); //expression basique, la moins restrictive

var_dump($ret); // test d'affichage

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

22 oct. 2007, 17:57

Hélas plus difficile que ça...:(

Utiliser les regex serait adapté dans le cas d'un affichage "d'un bloc".

Là il est important que mon affichage se fasse ligne par ligne au fur et à mesure (boucler et echo est donc indispenable pour chaque ligne)...

Je ne m'en sors vraiment pas...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

22 oct. 2007, 19:33

boucle ou pas boucle l'affichage se fera en une fois... à moins de faire appel au fonction de bufferisation

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 32 Messages

23 oct. 2007, 13:39

Bonjour ,

Le seul problème lié au preg_match , c'est que l'on doit obligatoirement chargé l'ensemble du texte dans une variable ce qui peux s avérer problématique dans le cadre d'un fichier volumineux.

Tout comme le stipule Truc si tu peux charger l'ensemble du fichier texte dans une variable sa solution est tres adapté.

Sinon utilise une boucle avec un flag
0- flag affichage à 0
1-je boucle jusqu'a fin de lecture du fichier ou flag d affichage a 2
2-je trouve <mabalise> ,je positionne le flag d affichage à 1
3-je trouve </mabalise>,je positionne le flag d affichage à 2
4-si le flag d affichage > 0 ,j'affiche le texte

Enfin ce n est qu une solution parmis d autre. A toi de voir la plus adaptée.

Eléphant du PHP | 445 Messages

23 oct. 2007, 15:11

Il peut faire les 2.

Rechercher ligne par ligne jusqu'a ce que l'expression regulière soit vrai.
function DisplayService ($MyfpM) {

    while(!feof($MyfpM)) {    
        $line = fgets($MyfpM,4096);    
        echo($line);
        if(preg_match('#<mabalise>(.*)</mabalise>#',$line,$ret)) {
        
        }
        
    }
    fclose($MyfpMixad);
}