Analyser le contenu de balises html sur plusieurs lignes

Eléphanteau du PHP | 37 Messages

09 juin 2011, 13:43

Bonjour,

J'ai besoin de repérer le contenu de certaines balises html.
Par exemple, je veux pouvoir établir une table des figures, sachant que chaque figure est repérée comme suit :
<p class="Legende">Légende de la figure</p>
J'utilise donc une fonction preg_match_all pour obtenir une table de toutes les occurrences <p class="Legende">...</p> :
preg_match_all("/<p class=\"Legende\"([^>]+)>(.*)<\/p>/U", $document, $figures, PREG_SET_ORDER);
(la première parenthèse correspond à d'éventuels attributs ; la deuxième correspond au libellé de la légende)


Le problème, c'est que le fichier html a été enregistré avec un paquet de sauts de ligne automatiques sur lesquels je n'ai aucune maîtrise.
Le contenu des balises mentionnées peut donc être réparti sur deux lignes. Dans ce cas, preg_match_all ne repère pas l'occurrence dans la mesure où il ne voit pas la balise fermante </p> qui se trouve sur la deuxième ligne.

Comment puis-je donc repérer toutes les occurrences <p class="Legende">...</p>, que le texte de la légende soit contenu sur une ligne ou sur deux (voire plusieurs ) lignes.

Merci d'avance pour votre aide

ViPHP
ViPHP | 2577 Messages

09 juin 2011, 14:12

Bonjour,

Tu traites ligne par ligne ? Dans ce cas, traite tout le fichier d'un coup.

Eléphanteau du PHP | 37 Messages

09 juin 2011, 23:23

Bonjour,

Merci de ta réponse.

En fait, j'ai réalisé que la question pouvait être formulée autrement :
Est-il possible d'inclure les sauts de ligne dans une expression régulière ?

En cherchant dans cette direction ("php expression régulière sauts de ligne"), j'ai pu trouver la solution :
Il faut placer en tête du groupe (.*) l'option (?s) qui indique que les sauts de ligne doivent être inclus dans le groupe.

L'écriture de preg_match_all devient donc
preg_match_all("/<p class=\"Legend\"([^>]+)>((?s).*)<\/p>/U", $document, $figures, PREG_SET_ORDER);
Je récupère donc bien le texte compris entre les balises <p class=Legende"> et </p> avec les sauts de ligne éventuels, sauts de ligne que je peux ensuite remplacer par des espaces :
foreach($figures as $figure)
{
	$indice_figure += 1;
	$contenu_balise = $figure[1];
	$contenu_legende = $figure[2];
	$contenu_legende = preg_replace("#\n#", " ", $contenu_legende);
J'ai donc gagné un petit accroissement de ma (petite) compétence en php et espère que ce post servira à d'autres programmeurs débutants en php :wink: