Bonjour à tous,

J'essaie de construire une regex depuis 3jrs afin de récupérer le contenu d'un SVG sans succès.

Voici le contenu de test

<g id="Tie2"> <path fill="#402A23" d="M21,2.307c0,1.809,0,3.016,0,3.016s0.057,1.809-1.752,1.809l0.178,0.682l-5.027,5.042l1.342-5.723 c0,0-1.741,0-1.741-1.809c0-1.809,0-3.016,0-3.016S13.876,1,15.686,1s3.618,0,3.618,0S21,0.498,21,2.307z"/> <polygon fill="#402A23" points="20.993,14.717 12.001,23.709 13.684,16.14 19.919,9.905 "/> <polygon fill="#402A23" points="22.855,23.106 14.305,31.657 10.861,28.841 11.271,26.996 21.457,16.81 "/> <polygon fill="#402A23" points="24.128,28.841 17.495,34.269 15.709,32.809 23.32,25.198 "/> </g> <path id="TV" fill="#402A23" d="M32.154,8.083H17.152l4.972-5.813l-1.649-1.406l-5.688,6.633L9.098,0.863L7.447,2.27l4.972,5.813 c-5.297,0-9.574,0-9.574,0s-2.171,0-2.171,2.171v19.541c0,0,0,2.17,2.171,2.17h3.257v2.172h3.257v-2.172h16.283v2.172h3.257v-2.172 c1.997,0,3.256,0,3.256,0s2.172,0,2.172-2.17V10.254C34.326,10.254,34.326,8.083,32.154,8.083z M23.47,26.538 c0,0,0,2.171-2.171,2.171s-15.197,0-15.197,0s-2.171,0-2.171-2.171c0-2.172,0-13.027,0-13.027s0-2.171,2.171-2.171 s15.197,0,15.197,0s2.171,0,2.171,2.171C23.47,15.682,23.47,26.538,23.47,26.538z M28.355,25.452c-0.901,0-1.629-0.728-1.629-1.629 c0-0.9,0.728-1.628,1.629-1.628s1.628,0.728,1.628,1.628C29.983,24.725,29.257,25.452,28.355,25.452z M31.069,20.023h-5.428v-2.17 h5.428V20.023z M31.069,15.682h-5.428v-2.171h5.428V15.682z"/> <g id="Typewriter"> <g> <path fill="#402A23" d="M26.328,12.455v3.783H8.672v-3.783H4.888v16.396h25.223V12.455H26.328z M18.762,17.5h2.521v2.522h-2.521 V17.5z M18.762,21.283h2.521v2.522h-2.521V21.283z M13.717,17.5h2.522v2.522h-2.522V17.5z M13.717,21.283h2.522v2.522h-2.522 V21.283z M8.672,17.5h2.522v2.522H8.672V17.5z M8.672,21.283h2.522v2.522H8.672V21.283z M23.807,27.169H11.194v-2.102h12.612 V27.169z M26.328,23.806h-2.521v-2.522h2.521V23.806z M26.328,20.022h-2.521V17.5h2.521V20.022z"/> </g> <rect x="9.933" y="6.149" fill="#402A23" width="15.133" height="8.828"/> <rect x="1.105" y="11.194" fill="#402A23" width="2.522" height="5.044"/> <rect x="31.373" y="11.194" fill="#402A23" width="2.521" height="5.044"/> </g> <g id="capa"> <path fill="#402A23" d="M27.873,10.156L6.395,9.743c-3.322-0.064-4.033,2.12-4.077,4.438L2.117,24.654l2.607,0.003l0.202-10.474 C4.938,13.469,5.531,12.986,6.247,13l5.218,0.1l-0.226,11.73l1.304,0.025l0.225-11.729l3.91,0.075l-0.225,11.73l1.303,0.024 l0.226-11.729l9.123,0.175L26.88,25.13l1.303,0.025l0.226-11.713c1.101,0.351,1.275,1.467,1.255,2.52l-0.177,9.218l3.258,0.062 l0.178-9.217C32.982,12.886,30.478,10.205,27.873,10.156z"/> <rect x="6.138" y="13.012" transform="matrix(-0.9998 -0.018 0.018 -0.9998 13.2402 37.8739)" fill="#402A23" width="1.304" height="11.732"/> <rect x="8.745" y="13.06" transform="matrix(-0.9998 -0.0195 0.0195 -0.9998 18.424 38.033)" fill="#402A23" width="1.303" height="11.733"/> <rect x="13.959" y="13.161" transform="matrix(-0.9998 -0.0195 0.0195 -0.9998 28.8478 38.3347)" fill="#402A23" width="1.303" height="11.732"/> <rect x="19.172" y="13.262" transform="matrix(-0.9998 -0.0187 0.0187 -0.9998 39.2856 38.623)" fill="#402A23" width="1.303" height="11.731"/> <rect x="24.385" y="13.361" transform="matrix(-0.9998 -0.0195 0.0195 -0.9998 49.6941 38.9389)" fill="#402A23" width="1.304" height="11.733"/> <rect x="21.778" y="13.311" transform="matrix(-0.9998 -0.0195 0.0195 -0.9998 44.4827 38.7881)" fill="#402A23" width="1.304" height="11.733"/> </g> <g id="Typewriter2"> <rect x="9.933" y="6.149" fill="#402A23" width="15.133" height="8.828"/> <rect x="1.105" y="11.194" fill="#402A23" width="2.522" height="5.044"/> <rect x="31.373" y="11.194" fill="#402A23" width="2.521" height="5.044"/> <g> <path fill="#402A23" d="M26.328,12.455v3.783H8.672v-3.783H4.888v16.396h25.223V12.455H26.328z M18.762,17.5h2.521v2.522h-2.521 V17.5z M18.762,21.283h2.521v2.522h-2.521V21.283z M13.717,17.5h2.522v2.522h-2.522V17.5z M13.717,21.283h2.522v2.522h-2.522 V21.283z M8.672,17.5h2.522v2.522H8.672V17.5z M8.672,21.283h2.522v2.522H8.672V21.283z M23.807,27.169H11.194v-2.102h12.612 V27.169z M26.328,23.806h-2.521v-2.522h2.521V23.806z M26.328,20.022h-2.521V17.5h2.521V20.022z"/> </g> </g>

Et voici l'expression que j'utilise

(?P<groupeSimples>(?:(?:<g.*?>\s*){1}.*?<\/g>))

Je souhaite récupérer tous les groupes qui sont formatés de la sorte (ca c'est bon !)

<g>
    <contenu ..... />
        <contenu ..... />
            <contenu ..... />
</g>

Mais je veux également récupérer les groupes imbriqués (mais là ça coince)

<g>
    <contenu ..... />
    <g>.....</g>
        <contenu ..... />
        <g>
            <contenu ....../>
            <g>
                <contenu ..../>
            </g>
        </g>
            <contenu ..... />
</g>

Mon expression s'arrête dès qu'elle rencontre une balide fermante </g>

J'ai regadé des tones de sites sur les regex, j'en suis à la 11 version de mon expression, mais rien n'y fait.

L'un d'entre vous pourrais-t'il m'expliquer ce que j'ai raté dans mon code ?

Merci beaucoup

Fabien

4 réponses


PhiSyX
Réponse acceptée

Bonjour. Ta regex ne match pas tout non? Ou alors je n'ai pas tout à fait compris ce que tu veux faire...

Ta regex: https://regex101.com/r/hE5zJ3/1 (matches 2)
La mienne: https://regex101.com/r/hE5zJ3/2 (matches 4)

fabienc
Auteur
Réponse acceptée

Salut,
Merci pour ton aide.

J'ai essayé pleins de trucs, et j'ai trouvé ça
[]()https://regex101.com/r/hE5zJ3/3 (matches 4)

grâce à ce site
[]()http://blog.stevenlevithan.com/archives/match-innermost-html-element

J'ai testé et cela semble correspondre à ce que je veux.
Je n'ai pas tout compris, pour l'instant.
Il est vrai que les Regex ne sont pas aussi simple qu'elles n'y paraissent.
Je vais poursuivre avec celle-ci pour le moment.

fabienc
Auteur

Bon alors j'avance,
j'ai réussi déjà à "presque" ne capturer que les groupes simple

(?P<groupeSimples>(?:<g\s[a-zA-Z0-9=">\.,\#\/]+\s*>(?:.|\s)(?!<g))(.*?)<\/g>)

Sauf que là il surveille que si le <g..> n'est pas immédiatement suivi d'un [<]g[>]
du coup il ne capture plus (et ça c'est cool)

<g id="Typewriter"> <g> <path fill="#402A23" d="M26.328,12.455v3.783H8.672v-3.783H4.888v16.396h25.223V12.455H26.328z M18.762,17.5h2.521v2.522h-2.521 V17.5z M18.762,21.283h2.521v2.522h-2.521V21.283z M13.717,17.5h2.522v2.522h-2.522V17.5z M13.717,21.283h2.522v2.522h-2.522 V21.283z M8.672,17.5h2.522v2.522H8.672V17.5z M8.672,21.283h2.522v2.522H8.672V21.283z M23.807,27.169H11.194v-2.102h12.612 V27.169z M26.328,23.806h-2.521v-2.522h2.521V23.806z M26.328,20.022h-2.521V17.5h2.521V20.022z"/> </g> <rect x="9.933" y="6.149" fill="#402A23" width="15.133" height="8.828"/> <rect x="1.105" y="11.194" fill="#402A23" width="2.522" height="5.044"/> <rect x="31.373" y="11.194" fill="#402A23" width="2.521" height="5.044"/> </g>

Par contre, il me capture celui-ci (sans prendre le dernier [</]g[>])

<g id="Typewriter2"> <rect x="9.933" y="6.149" fill="#402A23" width="15.133" height="8.828"/> <rect x="1.105" y="11.194" fill="#402A23" width="2.522" height="5.044"/> <rect x="31.373" y="11.194" fill="#402A23" width="2.521" height="5.044"/> <g> <path fill="#402A23" d="M26.328,12.455v3.783H8.672v-3.783H4.888v16.396h25.223V12.455H26.328z M18.762,17.5h2.521v2.522h-2.521 V17.5z M18.762,21.283h2.521v2.522h-2.521V21.283z M13.717,17.5h2.522v2.522h-2.522V17.5z M13.717,21.283h2.522v2.522h-2.522 V21.283z M8.672,17.5h2.522v2.522H8.672V17.5z M8.672,21.283h2.522v2.522H8.672V21.283z M23.807,27.169H11.194v-2.102h12.612 V27.169z M26.328,23.806h-2.521v-2.522h2.521V23.806z M26.328,20.022h-2.521V17.5h2.521V20.022z"/> </g> </g>

Bon, il ne me rest eplus qu'à trouver comment lui dire de ne pas récupérer le groupe Imbriqué, lorsqu'un [<]g[>] n'est pas immédiatement suivi d'un autre [<]g[>]

A suivre

fabienc
Auteur

Ca y est, j'ai réussi à faire une expression toute bête qui semble fonctionner :

(?P<groupeSimples>(?:<g\s[^>]+\s*>(?:.|\s)(?:(?!<g).)*)<\/g>)

Elle me récupère bien les groupes, ne contentant pas de groupes, peu importe leur emplacement dans le groupe

La suite des évènements, faire le contraire :)

Fabien