PCRE et imbrications de balises

20 views
Skip to first unread message

Cyril Lopez

unread,
Jun 28, 2011, 5:47:12 AM6/28/11
to webd...@googlegroups.com
Bonjour à tous

Je bloque sur un truc que tout le monde doit avoir déjà fait.
Je cherche à parser une chaîne, à capturer quelques morceaux, etc.
Je ne peux pas utiliser domDocument de php parce que j'invente des
balises HTML et mon imbrication ne plaira pas à loadXML non plus.

Ma chaine simplifiée :
$partialHtmlOutput =
   '
     <mbLoop name="variants">
       <item>
         [[variantsLabel]]=>[[variantsPriceFormat]]=>[[variantsId]]
         <mbLoop name="productsInStock">
           Lorem
         </mbLoop>
       </item>
     </mbLoop>
     <div>AAA</div>
     <mbLoop>AA</mbLoop>
   ';

Je cherche à parser chaque balise <mbLoop>, à capturer la valeur de
son attribut name et son contenu.

Pour simplifier, je pars du principe qu'il ne peut y a voir qu'un seul
niveau d'imbrication.
J'arrive ici :
preg_match("/<mbLoop[^>]*>(.*?)(<mbLoop[^>]*>.*?<\/mbLoop>)+(.*?)<\/mbLoop>/s",
$partialHtmlOutput, $matches)

Ceci marche bien, mais j'aimerai ajouter le fait que l'imbrication
soit optionnelle. Mais ceci ne fonctionne plus (+ remplacé par ?) :
preg_match("/<mbLoop[^>]*>(.*?)(<mbLoop[^>]*>.*?<\/mbLoop>)?(.*?)<\/mbLoop>/s",
$partialHtmlOutput, $matches)

Au final je veux :
[] => 'variants',
[] => '<item>
         [[variantsLabel]]=>[[variantsPriceFormat]]=>[[variantsId]]',
[] => '<mbLoop name="variantsInStock">....</mbLoop>', // Ou mieux,
l'imbrication parsée aussi...
[] => </item>
...

Si une bonne âme se sent de pointer du doigt l'endroit où je me fourvoie...
Merci et bonne chaude après midi.

--
Cyril Lopez - Nethik

Julien Wajsberg

unread,
Jun 28, 2011, 5:51:11 AM6/28/11
to webd...@googlegroups.com
2011/6/28 Cyril Lopez <loveis...@gmail.com>:

> Bonjour à tous
>
> Je bloque sur un truc que tout le monde doit avoir déjà fait.
> Je cherche à parser une chaîne, à capturer quelques morceaux, etc.
> Je ne peux pas utiliser domDocument de php parce que j'invente des
> balises HTML

Déjà tu te fourvoies là, à mon sens.
L'API DOM permet de traiter du XML quelconque, pas que du HTML "standard".

Les regexp ne sont pas la bonne techno pour traiter un arbre XML.

Désolé :-)
--
Julien

Edouard Seynaeve

unread,
Jun 28, 2011, 6:06:57 AM6/28/11
to webd...@googlegroups.com

PHP Simple HTML DOM Parser





2011/6/28 Julien Wajsberg <fel...@gmail.com>

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes Professionnels francophones du développement web.
Pour envoyer un message à ce groupe, adressez un e-mail à webd...@googlegroups.com.
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse webdevfr+u...@googlegroups.com.
Pour plus d'options, consultez la page de ce groupe : http://groups.google.com/group/webdevfr?hl=fr


Cyril Lopez

unread,
Jun 28, 2011, 10:39:49 AM6/28/11
to webd...@googlegroups.com
Le 28 juin 2011 11:51, Julien Wajsberg <fel...@gmail.com> a écrit :
> 2011/6/28 Cyril Lopez <loveis...@gmail.com>:
>> Bonjour à tous
>>
>> Je bloque sur un truc que tout le monde doit avoir déjà fait.
>> Je cherche à parser une chaîne, à capturer quelques morceaux, etc.
>> Je ne peux pas utiliser domDocument de php parce que j'invente des
>> balises HTML
>
> Déjà tu te fourvoies là, à mon sens.
> L'API DOM permet de traiter du XML quelconque, pas que du HTML "standard".

Oui c'est pour cela que j'ai testé la méthode loadXML de domDocument.
Mais ma chaine n'est pas un XML correct.
Ex:
<loopHead>
<select name="lorem">
</loopHead>
<loopFoot>
</select>
</loopFoot>


Merci Edouard pour lien. Je m'étais mis de côté ce parser si je
n'arrivais à rien d'autre.

Cyril, Nethik

Julien Wajsberg

unread,
Jun 28, 2011, 10:43:55 AM6/28/11
to webd...@googlegroups.com
2011/6/28 Cyril Lopez <loveis...@gmail.com>:

> Le 28 juin 2011 11:51, Julien Wajsberg <fel...@gmail.com> a écrit :
>> 2011/6/28 Cyril Lopez <loveis...@gmail.com>:
>>> Bonjour à tous
>>>
>>> Je bloque sur un truc que tout le monde doit avoir déjà fait.
>>> Je cherche à parser une chaîne, à capturer quelques morceaux, etc.
>>> Je ne peux pas utiliser domDocument de php parce que j'invente des
>>> balises HTML
>>
>> Déjà tu te fourvoies là, à mon sens.
>> L'API DOM permet de traiter du XML quelconque, pas que du HTML "standard".
>
> Oui c'est pour cela que j'ai testé la méthode loadXML de domDocument.
> Mais ma chaine n'est pas un XML correct.
> Ex:
>  <loopHead>
>   <select name="lorem">
>  </loopHead>
>  <loopFoot>
>    </select>
>  </loopFoot>

En effet;

dans un XML valide tu devrais mettre un CDATA.
(et à mon avis tu devrais le faire, mais ce n'est que ça : mon avis :-) )

--
Julien

Cyril Lopez

unread,
Jun 29, 2011, 4:30:05 AM6/29/11
to webd...@googlegroups.com

Merci pour ton avis et de ta participation, ça me fait avancer dans ma
réflexion.
Bonne journée !

Cyril, Nethik

Reply all
Reply to author
Forward
0 new messages