Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

fgets - ne pas lire une (serie de) lign e

3 réponses
Avatar
Damien
Bonjour

Je souhaite parcourir un fichier php en lecture, et récupérer la liste
des fichiers inclus dans ce fichier.
Mon idée est donc d'ouvrir ce fichier en lecture, de récupérer les
lignes et ensuite de faire une expression réguliere pour ne garder que
les fichiers apelés.
Le hic, c'est que ce le script ouvre la page courante, et donc, boucle.
Y aurait il un moyen pour que fgets ignore certaines lignes (ces lignes
du fichier php qui ouvre ce meme fichier en lecture et font le fgets)?

L'idée est de parcourir ensuite les fichiers inclus pour chercher les
titres de paragraphes et faire un index automatique. Peut etre y a t -il
plus simple?

Merci de votre aide.

3 réponses

Avatar
Olivier Miakinen
Le 27/02/2009 20:39, Damien a écrit :

Je souhaite parcourir un fichier php en lecture, et récupérer la liste
des fichiers inclus dans ce fichier.
Mon idée est donc d'ouvrir ce fichier en lecture, de récupérer les
lignes



$string = file_get_contents("/chemin/script.php");

Ça a des chances d'être plus simple, et probablement même plus rapide,
qu'une série de fgets().

et ensuite de faire une expression réguliere pour ne garder que
les fichiers apelés.



Ok. Je te signale à tout hasard qu'il existe un nouveau groupe
de discussions fr.comp.lang.regexp pour discuter des expressions
rationnelles. Cela peut être utile.

Le hic, c'est que ce le script ouvre la page courante, et donc, boucle.
Y aurait il un moyen pour que fgets ignore certaines lignes (ces lignes
du fichier php qui ouvre ce meme fichier en lecture et font le fgets)?



Tu veux parler du cas où des fichiers PHP s'incluent mutuellement, mais
qu'un include_once ou autre mécanisme évite les bouclages ? Il te suffit
de maintenir un tableau des noms de fichiers déjà traités, et de tester
par isset() si le nom de fichier que tu viens de lire s'y trouve ou pas.

L'idée est de parcourir ensuite les fichiers inclus pour chercher les
titres de paragraphes et faire un index automatique.



Ça ne marchera que si tous tes titres sont codés en dur. Par exemple le
cas suivant ne marchera pas bien :

$titre = obtient_nom_localisé("home page"); // "accueil" en français
echo "<h1>$titre</h1>";

Peut-être y a-t-il plus simple?



Pas sûr.

--
Olivier Miakinen
Avatar
Damien
Bonjour
J'ai un pb avec un preg_match_all et le tableau résultant.

L'extrait du code:
Le masque étant l'expression <p class="contTitre1">(.*)<.p> (tous les titres de parapraphe étant entre ce code).
$nb=preg_match_all($masque,$message,$regs);
echo $nb;
foreach ($regs as $key=>$val) {
$titr="<ul>".str_replace('</p>','',str_replace('<p class="contTitre1">','',$val[$key]))."</ul>";
echo $titr;
}

Le echo $nb me retourne 5.
La boucle foreach me retourne les 3 premiers éléments du tableau. Si je fais un echo $val[3] ou un echo $val[4], j'ai bien des données stockées.
Pourquoi ai-je une différence, et d'où vient elle?

Merci de votre aide.

Damien
Avatar
Olivier Miakinen
Bonjour,

Le 02/03/2009 15:14, Damien a écrit :

J'ai un pb avec un preg_match_all et le tableau résultant.

L'extrait du code:
Le masque étant l'expression <p class="contTitre1">(.*)<.p> (tous les
titres de parapraphe étant entre ce code).



Hmmm... pas une très bonne idée pour la sémantique, donc pour
l'accessibilité et le référencement. un <h1> (ou <h2>, <h3>, etc.)
serait préférable.

$nb=preg_match_all($masque,$message,$regs);
echo $nb;
foreach ($regs as $key=>$val) {
$titr="<ul>".str_replace('</p>','',str_replace('<p class="contTitre1">','',$val[$key]))."</ul>";
echo $titr;
}

Le echo $nb me retourne 5.
La boucle foreach me retourne les 3 premiers éléments du tableau. Si je fais un echo $val[3] ou un echo $val[4], j'ai bien des données stockées.
Pourquoi ai-je une différence, et d'où vient elle?



D'un défaut de lecture de la doc...
<http://fr2.php.net/preg_match_all>
(paramètre flags, qui vaut PREG_PATTERN_ORDER par défaut)

En fait, je suis étonné que cela te retourne 3 éléments, j'aurais dit 2
éléments vu que tu n'as qu'une seule paire de parenthèses capturantes.
Ici, ton premier $val[$key] est censé contenir le premier paragraphe
entier, y compris les balises, tandis que le second ne contiendra que
le contenu du second paragraphe, sans les balises.

Essaye :

$nb=preg_match_all($masque,$message,$regs);
echo $nb;
foreach ($regs[1] as $val) {
$titr="<ul>$val</ul>";
echo $titr;
}

Cordialement,
--
Olivier Miakinen