Discussion:
fgets - ne pas lire une (serie de) lign e
(trop ancien pour répondre)
Damien
2009-02-27 19:39:26 UTC
Permalink
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.
Olivier Miakinen
2009-02-27 19:59:15 UTC
Permalink
Post by Damien
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().
Post by Damien
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.
Post by Damien
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.
Post by Damien
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>";
Post by Damien
Peut-être y a-t-il plus simple?
Pas sûr.
--
Olivier Miakinen
Damien
2009-03-02 14:14:14 UTC
Permalink
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
Olivier Miakinen
2009-03-02 15:10:54 UTC
Permalink
Bonjour,
Post by Damien
J'ai un pb avec un preg_match_all et le tableau résultant.
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.
Post by Damien
$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
Continuer la lecture sur narkive:
Loading...