Page 1 sur 1

preg_match_all et parsing html

Posté : 02 oct. 2009, 18:26
par damaskinos
Bonjour a tous,

J'ai un petit problème avec les expressions régulières et preg_match_all. Je m'y prend peut-être mal alors je vais commencer par expliquer mon problème.

Disons que j'ai un code comme ceci.
<b>contenu 1</b><b>contenu 2</b><b>contenu 3</b>
ce que j'aimerais c'est avoir les contenus des tags dans un tableau.

J'ai donc essayé ça :
$matches = array();
preg_match_all('#<b[^>]*>(.*)</b>#i', $str, $matches,PREG_PATTERN_ORDER)

Quand je fais un var_dump de $matches, j'ai
array(2) { [0]=> array(1) { [0]=> string(48) "contenu 1contenu 2contenu 3" } [1]=> array(1) { [0]=> string(41) "contenu 1contenu 2contenu 3" } }
$matches[0][0] 
me donne
"contenu 1contenu 2contenu 3"
alors que j'aimerais plus avoir quelque chose du genre

$matches[0][0] = 'contenu 1';
$matches[0][1] = 'contenu 2';
$matches[0][2] = 'contenu 3';
J'espere que je suis assez claire. Le code html vient d'un fichier externe. Avec file_get_contents, je récupère le code et essaye d'appliquer ma regex. Si ce que je veux est pas possible avec preg_match_all, l'autre solution qui m'est venu a l'esprit est d'ouvrir le fichier avec fopen en lecture et de parcourir avec fgets le fichier ligne par ligne ensuite d'appliquer la regex sur la ligne. Si une correspondance est trouvée je le ''push'' moi même dans un tableau, le seul hic ici c'est que si la balise fermante est pas sur la même ligne, ma regex ne marche pas. JE sais pas si quelqu'un aurait déjà eu à faire un truc similaire ou tout juste quelqu'un aurait des conseils.


Merci d'avance

Re: preg_match_all et parsing html

Posté : 02 oct. 2009, 18:49
par Victor BRITO
Bienvenue dans l'univers des captures gloutonnes ! ;)

Pour y remédier, il y a deux solutions :
  1. soit tu utilises le ? après le quantifiant du masque
    preg_match_all ('#<b[^>]*?>(.*?)</b>#i', $str, $matches, PREG_PATTERN_ORDER);
  2. soit tu utilises l'option de recherche U (U pour ungreedy, qui veut dire « non glouton »)
    preg_match_all ('#<b[^>]*>(.*)</b>#iU', $str, $matches, PREG_PATTERN_ORDER);

Re: preg_match_all et parsing html

Posté : 02 oct. 2009, 18:57
par damaskinos
Merci beaucoup,

Ca fonctionne parfaitement.

merci.