Forum Programmation.php Expression régulière avec "solutions imbriquées"

Posté par  .
Étiquettes : aucune
0
20
août
2006
Je cherche à extraire d'un code HTML toutes les chaînes de caractères se trouvant entre deux tags.
Je dois aussi pouvoir connaître le nom de ces deux tags.

Par exemple, j'aimerais extraire du source suivant (les signes inférieur/supérieur des balises html ont été remplacés par { et } pour l'affichage)...
{p}un exemple avec {i}de l'italique{/i} et des sauts de lignes{br/}...{/p}


...Les éléments suivants :
- {p}un exemple avec {i}
- {i}de l'italique{/i}
- {/i} et des sauts de lignes{br/}
- {br/}...{/p}

Pour cela, j'utilise cette expression régulière :
/\{([^}]+)\}([^}]+)\{([^}]+)\}/s


Le problème, c'est qu'elle me "zappe" un élément sur deux et ne me retourne que :
- {p}un exemple avec {i}
- {/i} et des sauts de lignes{br/}

Ca doit être dû au fait que les éléments que je souhaite obtenir "partagent" un tag en commun, et que la recherche se poursuit à partir de la fin de la dernière solution trouvée et non à partir de la position de début de solution + 1...

Une solution aurait pu être d'utiliser l'expression régulière suivante :
/\}([^}]+)\{/s

Elle trouve bien tous les éléments, mais elle ne me permet pas d'obtenir le nom des deux tags qui encadrent chaque élément. Or, il me les faut absolument car j'ai un traitement à faire en fonction de ces tags...

Vos solutions sont les bienvenues !
  • # ébauche de solution

    Posté par  . Évalué à 2.

    J'avais fait un truc du genre, avec une base de donnée derrière, et je pouvais regenerer la page.

    Si je me souviens bien la base était :

    id | balise | texte (null possible)


    Ensuite, je lisais la base et je recollais, mais pour toi, tu relis la base et tu colle balise | texte pour la première ligne, et pour toutes les autres balise *2 | texte .

    Si tu est interessé, j'essaye de retrouver mes sources pour te les envoyer ;)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.