IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Problème regex


Sujet :

Collection et Stream Java

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Par défaut Problème regex
    Bonjour,

    Je suis débutant en Java et j'aimerais extraire l'information {Alpha1;AlphaDE4} des balises suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //<span class="planete-name">Alpha1</span>
    //<span class="planete-koords">[2:147:5]</span>  
     
     //<span class="planete-name">AlphaDE4</span>
    //<span class="planete-koords">[5:147:5]</span>
    Pour que l'extraction soit correct je fais d'abord un tableau de String que j' initialise .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import java.util.ArrayList;
    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
     
    import android.util.Log;
     
    public class httpAnalyse {
     
     public ArrayList<String> lists_planete = new ArrayList<String>();
    Voici le String que je veux parser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    <div id="countColonies">    
        <p class="textCenter tipsStandard" title="|Nombre de planètes possibles">
            <span>7/9</span> Planètes    </p>    
     
    </div>
     
         <div class="smallplanet">
                 <a href="index.php?page=overview&session=ad298d8dc16d&cp=35084069"
              title="|<B> [4:56:13]</B><BR>13.920km (43/163)<BR>-78 °C à -38°C en moyenne"
               class="planetlink  tipsStandard">
            <img class="planetPic" src="img/planets/ice_10_1.gif"/>
             <span class="planet-name">Alpha1</span>
             <span class="planet-koords">[2:56:13]</span>
             </a>
              </div>
     
         <div class="smallplanet">
                 <a href="index.php?page=overview&session=ad298d8dc16d&cp=35084026"
              title="|<B> [5:493:15]</B><BR>13.824km (43/163)<BR>-82 °C à -42°C en moyenne"
               class="planetlink  tipsStandard">
            <img class="planetPic" src="img/planets/normal_9_1.gif"/>
             <span class="planet-name">Alpha145</span>
             <span class="planet-koords">[1:493:15]</span>
             </a>
              </div>
         <div class="smallplanet">
     
                 <a href="index.php?page=overview&session=ad298d8dc16d&cp=35083903"
              title="|<B> [6:147:5]</B><BR>15.840km (52/163)<BR>23 °C à 63°C en moyenne"
               class="planetlink  tipsStandard">
            <img class="planetPic" src="img/planets/normal_3_1.gif"/>
             <span class="planet-name">Demon3</span>
             <span class="planet-koords">[1:147:5]</span>
             </a>
                  <a class="constructionIcon tipsStandard" title="|Mine de métal"><img src="img/icons/wrench.gif" height="12" width="12" /></a>
            </div>
         <div class="smallplanet">
     
                 <a href="index.php?page=overview&session=ad298d8dc16d&cp=35083516"
              title="|<B> [3:76:4]</B><BR>14.760km (58/163)<BR>24 °C à 64°C en moyenne"
               class="planetlink  tipsStandard">
            <img class="planetPic" src="img/planets/dry_1_1.gif"/>
             <span class="planet-name">AlphaTor</span>
             <span class="planet-koords">[2:76:4]</span>
             </a>
              </div>
         <div class="smallplanet">
                 <a href="index.php?page=overview&session=ad298d8dc16d&cp=35083506"
              title="|<B> [4:71:5]</B><BR>17.520km (60/163)<BR>25 °C à 65°C en moyenne"
               class="planetlink  tipsStandard">
     
            <img class="planetPic" src="img/planets/normal_7_1.gif"/>
             <span class="planet-name">Rocki</span>
             <span class="planet-koords">[4:71:5]</span>
             </a>
              </div>
         <div class="smallplanet">
                 <a href="index.php?page=overview&session=ad298d8dc16d&cp=35081882"
              title="|<B> [4:71:5]</B><BR>17.040km (92/163)<BR>27 °C à 67°C en moyenne"
               class="planetlink  tipsStandard">
            <img class="planetPic" src="img/planets/normal_7_1.gif"/>
     
             <span class="planet-name">Bioman</span>
             <span class="planet-koords">[1:71:5]</span>
             </a>
                  <a class="constructionIcon tipsStandard" title="|Silo de missiles"><img src="img/icons/wrench.gif" height="12" width="12" /></a>
            </div>
         <div class="smallplanet">
                 <a href="#"
                class="planetlink active tipsStandard"
                title="|<B> [2:55:7]</B><BR>12.800km (98/163)<BR>-3 °C à 37°C en moyenne">
            <img class="planetPic" src="img/planets/jungle_3_1.gif"/>
     
             <span class="planet-name">planète fuck</span>
             <span class="planet-koords">[1:55:7]</span>
             </a>
                  <a class="constructionIcon tipsStandard" title="|Mine de métal"><img src="img/icons/wrench.gif" height="12" width="12" /></a>
    Voici ma fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public ArrayList<String> AnalysePlName(String matr)
     {
         //lists_name
     
         //<span class="planete-name">Alpha1</span>
         //<span class="planete-koords">[2:147:5]</span>  
     
         String regex = "(net-name\"> )+([a-zA-Z0-9]+)(</span> )+";
         p = Pattern.compile(regex);
         m = p.matcher(matr); // get a matcher object
     
         Log.d("Android","zzz!!" );
         if (m.find())  
         {
              //System.out.println("Match planete "+ m.group(2));
              Log.d("AnalysePlName",m.group(2));
     
              lists_name.add(m.group(2));
         }
         return lists_name;  
     }
    Je n'obtiens qu'une valeur alors que je devrais avoir 7 valeurs au total.

    Avez-vous une idée ou une piste pour ce problème ?

  2. #2
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut Reponse possible
    Bonjour,

    Plutot que de vous focaliser sur la lecture texte de votre fichier en vous appuyant sur les expressions régulières, je vous propose d'exploiter les fonctionnalités de lecture et d'interpètation de la classe JEditorPane. Croyez-moi, ça vaut le coup d'examiner cette classe. En trois lignes de codes, elle vous permettra de récupérer les valeurs de toutes les balises 'planet-name'...
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Par défaut
    Bonjour Pursang

    Je viens de lire votre réponse et je trouve celle solution super par contre j'ai du mal a la mettre en application , pouvez-vous me donner un exemple avec la classe JEditorPane

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <html>
    <head>
    contenu du head
    </head>
    <body>
    <div id="monid">
    </div>
    </body>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JEditorPane pane = new JEditorPane(""text/html", "structure_de_ta_page");
    Element monid = pane.getDocument().getElement("monid");
    cdt

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Salut,

    11 minutes chrono pour écrire ça en Python

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    uh = '''<div id="countColonies"> 
    <p class="textCenter tipsStandard" title="|Nombre de planètes possibles">
    <span>7/9</span> Planètes </p> 
     
    </div>
     
    <div class="smallplanet">
    <a href="index.php?page=overview&session=ad298d8dc16d&cp=35084069"
    title="|<B> [4:56:13]</B><BR>13.920km (43/163)<BR>-78 °C à -38°C en moyenne"
    class="planetlink tipsStandard">
    <img class="planetPic" src="img/planets/ice_10_1.gif"/>
    <span class="planet-name">Alpha1</span>
    <span class="planet-koords">[2:56:13]</span>
    </a>
    </div>
     
    <div class="smallplanet">
    <a href="index.php?page=overview&session=ad298d8dc16d&cp=35084026"
    title="|<B> [5:493:15]</B><BR>13.824km (43/163)<BR>-82 °C à -42°C en moyenne"
    class="planetlink tipsStandard">
    <img class="planetPic" src="img/planets/normal_9_1.gif"/>
    <span class="planet-name">Alpha145</span>
    <span class="planet-koords">[1:493:15]</span>
    </a>
    </div>
    <div class="smallplanet">
     
    <a href="index.php?page=overview&session=ad298d8dc16d&cp=35083903"
    title="|<B> [6:147:5]</B><BR>15.840km (52/163)<BR>23 °C à 63°C en moyenne"
    class="planetlink tipsStandard">
    <img class="planetPic" src="img/planets/normal_3_1.gif"/>
    <span class="planet-name">Demon3</span>
    <span class="planet-koords">[1:147:5]</span>
    </a>
    <a class="constructionIcon tipsStandard" title="|Mine de métal"><img src="img/icons/wrench.gif" height="12" width="12" /></a>
    </div>
    <div class="smallplanet">
     
    <a href="index.php?page=overview&session=ad298d8dc16d&cp=35083516"
    title="|<B> [3:76:4]</B><BR>14.760km (58/163)<BR>24 °C à 64°C en moyenne"
    class="planetlink tipsStandard">
    <img class="planetPic" src="img/planets/dry_1_1.gif"/>
    <span class="planet-name">AlphaTor</span>
    <span class="planet-koords">[2:76:4]</span>
    </a>
    </div>
    <div class="smallplanet">
    <a href="index.php?page=overview&session=ad298d8dc16d&cp=35083506"
    title="|<B> [4:71:5]</B><BR>17.520km (60/163)<BR>25 °C à 65°C en moyenne"
    class="planetlink tipsStandard">
     
    <img class="planetPic" src="img/planets/normal_7_1.gif"/>
    <span class="planet-name">Rocki</span>
    <span class="planet-koords">[4:71:5]</span>
    </a>
    </div>
    <div class="smallplanet">
    <a href="index.php?page=overview&session=ad298d8dc16d&cp=35081882"
    title="|<B> [4:71:5]</B><BR>17.040km (92/163)<BR>27 °C à 67°C en moyenne"
    class="planetlink tipsStandard">
    <img class="planetPic" src="img/planets/normal_7_1.gif"/>
     
    <span class="planet-name">Bioman</span>
    <span class="planet-koords">[1:71:5]</span>
    </a>
    <a class="constructionIcon tipsStandard" title="|Silo de missiles"><img src="img/icons/wrench.gif" height="12" width="12" /></a>
    </div>
    <div class="smallplanet">
    <a href="#"
    class="planetlink active tipsStandard"
    title="|<B> [2:55:7]</B><BR>12.800km (98/163)<BR>-3 °C à 37°C en moyenne">
    <img class="planetPic" src="img/planets/jungle_3_1.gif"/>
     
    <span class="planet-name">planète fuck</span>
    <span class="planet-koords">[1:55:7]</span>
    </a>
    <a class="constructionIcon tipsStandard" title="|Mine de métal"><img src="img/icons/wrench.gif" height="12" width="12" /></a>
    '''
     
    import re
     
    print(re.findall('<span class="planet-name">(.+?)</span>',uh))

    Ceci pour montrer qu'avec une expression rrégulière, le résultat s’obtient facilement, sans s’embarasser d’apprendre comment fonctionne une classe.
    Mais ce n’est pas toujours aussi simplissime.



    PS

    11 minutes pour faire ça ??!
    ouh ouh... ouh ouh

  5. #5
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut La suite
    Effectivement, l'expression régulière dans ce cas précis est plus simple. Mais si demain la forme de la valeur à récupérer change, il faudra adapater l'expression régulière. Et si demain on veut récupérer une autre valeur que celle qui correspond à planet-name, etc...
    Pour ce qui est de l'utilisation du JEditorPane, je n'ai plus le temps de l'examiner de près pour condenser une explication dont le but serait de s'en service uniquement pour extraire des valeurs. En effet, c'est avant tout un composant swing d'abord destiné à être affiché à l'écran. Le fait qu'il soit capable d'interprèter le code HTML n'a d'interret pour lui que d'afficher une page HTML comme dans un navigateur. S'en servir pour extraire des valeurs d'un fichier HTML n'est qu'une utilisation détournée de ses fonctionalités.
    A mon souvenir, il faut le solliciter pour récupérer un objet de type HtmlDocument qui met à disposition un jeu de méthode permettant "d'interroger" le document par rapport à son balisage. La difficulté tient dans son fonctionnement similaire à celui d'un flux (normal, par défaut je le rappelle c'est fait pour afficher des pages web qui sont des flux réseau) organisé comme une arborescence.
    Dés que j'ai plus de temps, je vous fait quelques lignes de code exemple....
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  6. #6
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut Un peu d'aide
    Tout d'abord, deux cas possibles. Le fichier HTML est manipulé localement en ouvrant directement ce dernier sous forme d'un objet File. Soit, il s'agit d'une réponse liée à une connexion HTTP via une URL.
    Dans les deux cas, pour le bon fonctionnement de cette solution, il faut aboutir en premier à un flux d'entré de type InputStream.
    Dans le cas d'un fichier ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileInputStream fluxEntree = new FileInputStream(new File("chemin complet vers votre fichier html"));
    Dans le cas d'une URL de type HTTP, ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    URL url = new URL("votre url HTTP");
    InputStream fluxEntree = url.openStream();
    Maintenant que nous tenons notre flux d'entrée, passons à JEditorPane.D'abord, on se fait une instance spécifique pour le HTML de JEditorPane :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JEditorPane extracteur = new JEditorPane("text/html", null);
    Ensuite, il faut instancier un objet de type HTMLDocument pour héberger le code HTML que l'on va lire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTMLDocument documentHTML = new HTMLDocument();
    puis lire le flux et remplir notre documentHTML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extracteur.read(fluxEntree, documentHTML);
    Maintenant, il suffit de raisonner avec notre documentHTML comme s'il s'agissait d'une arborescence de type JTree. Attention, je préciserai une chose essentielle, il est impératif que le code HTML soit CLEAN. Des balises non fermées ne gêneront pas l'affichage de la page, mais son interrogation s'en verra évidement fortement compromise. En effet, l'organisation interne du documentHTML est conditionné sous forme d'arborescences imbriquée. Le noeud HTML contient généralement les noeuds TITLE, BODY etc. Puis le noeud BODY qui ici nous interresse contient lui des eléments (les balisages qu'il encadre parmis lesquels nous allons rechercher la balise planet-name).
    Pour ce faire, nous allons commencer par pointer notre block d'eléments principale représenté par le jeux de balises <HTML>...</HTML> ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTMLDocument.BlockElement racineHTML = (HTMLDocument.BlockElement)documentHTML.getDefaultRootElement();
    On en profite pour préparer deux objets HTMLDocument.BlockElement qui vont servir à récupérer la valeur contenue dans le balisage recherché :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTMLDocument.BlockElement elementTrav = null, elementBody = null;
    Comme notre balisage planet-name se trouve dans le balisage <BODY>...</BODY>, on va d'abord récupérer le block d'elément BODY :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int positionBody = -1;
    for (int i = 0 ; i < racineHTML.getElementCount() ; i++) {
        if (racineHTML.getElement(i).getName().equalsIgnoreCase("body")) positionBody = i;
        }
    elementBody = (HTMLDocument.BlockElement)racineHTML.getElement(positionBody);
    Maintenant, il ne reste plus qu'à lire le bloque d'elements BODY et de ne s'interresser qu'à la balise planet-name : Attention, je préciserai ici qu'il devient necéssaire que cette dernière soit directement dans la balise BODY, pas dans un TABLE ou un FORM. Donc par rapport à votre code HTML, je ne sais pas si ça colle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (int i = 0 ; i < elementBody.getElementCount() ; i++) {
        if (elementBody.getElement(i).getName().equalsIgnoreCase("span")) {
            // Il ne reste plus qu'à récupérer la valeur de l'attribut class de la balise span, histoire de ne s'interresser qu'à planet-name.
            // Dans un premier temps, il faudra récupérer l'offset de départ et celui de fin du texte hors balisage en récupérant le span sous la forme d'un RunElement, et non d'un BlockElement.
            // On peut alors récupérer le texte contenu par la méthode getDocument().getText(offsetdebut, offsetfin - offsetdebut) du RunElement.
            }
        }
    Désolé pour la finalité, je vous laisse chercher un peu, je n'ai plus le temps de poursuivre, mais je penses que l'idée est interessante. Je préciserai aussi que je n'ai pas testé ce code, mes explications sont issue d'une utilisation personnelle de JEditorPane que j'ai fait pour extraire dans différents formats (xls, xml, csv, etc...) des tableaux de résultats sportifs contenus dans des pages HTML sous forme de <TABLE...>...</TABLE>.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Merci pursang d’avoir pris la peine de faire cette intéressante exposition de début de solution en Swing.





    - J’ai rassemblé les instructions que tu as données.
    Il est vraisemblable que xnutella voudra télécharger les données présentes sur un site web, j’ai donc pris l’option de départ “réponse liée à une connexion HTTP via une URL“.

    Ça donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    URL url = new URL("votre url HTTP");
    InputStream fluxEntree = url.openStream();
     
    JEditorPane extracteur = new JEditorPane("text/html", null);
    HTMLDocument documentHTML = new HTMLDocument();
    extracteur.read(fluxEntree, documentHTML);
     
    HTMLDocument.BlockElement racineHTML = (HTMLDocument.BlockElement)documentHTML.getDefaultRootElement();
    HTMLDocument.BlockElement elementTrav = null, elementBody = null;
     
    int positionBody = -1;
    for (int i = 0 ; i < racineHTML.getElementCount() ; i++) {
        if (racineHTML.getElement(i).getName().equalsIgnoreCase("body")) positionBody = i;
        }
    elementBody = (HTMLDocument.BlockElement)racineHTML.getElement(positionBody);
     
     
    for (int i = 0 ; i < elementBody.getElementCount() ; i++) {
        if (elementBody.getElement(i).getName().equalsIgnoreCase("span")) {
            // Il ne reste plus qu'à récupérer la valeur de l'attribut class 
            // de la balise span, histoire de ne s'interresser qu'à planet-name.
            // Dans un premier temps, il faudra récupérer l'offset de départ et celui de
            // fin du texte hors balisage en récupérant le span sous la forme
            // d'un RunElement, et non d'un BlockElement.
            // On peut alors récupérer le texte contenu par la méthode
            // getDocument().getText(offsetdebut, offsetfin - offsetdebut) du RunElement.
            }
        }

    La déclaration
    je vous propose d'exploiter les fonctionnalités de lecture et d'interprétation de la classe JEditorPane. (...) En trois lignes de codes, elle vous permettra de récupérer les valeurs de toutes les balises 'planet-name'...
    apparaît déjà un tantinet explosée.









    -
    Effectivement, l'expression régulière dans ce cas précis est plus simple. Mais si demain la forme de la valeur à récupérer change, il faudra adapater l'expression régulière. Et si demain on veut récupérer une autre valeur que celle qui correspond à planet-name, etc...
    Ne serait-ce pas la même chose avec une autre solution, y compris JEditorPane ?

    Je ne conçois pas comment il pourrait être possible de récupérer des données d’une page web sans analyser le code source de cette page.
    Or, que l’on fasse un réglage de l’analyse et de la recherche effectuées par une expression régulière ou par JEditorPane ou tout autre moyen, n’importe quelle solution d’extraction est exposée au risque de voir le code source modifié sans crier gare.
    La seule mesure qui puisse être prise est d’inclure dans le code des instructions permettant de détecter tout écart ou bizarrerie dans un code source reçu et d’envoyer une alerte. On ne coupe pas à devoir faire de la veille, si l’importance des données est continue.

    En quoi une solution avec JEditorPane apporterait elle un avantage ? Comment JEditorPane permettrait elle de disposer d’une réponse automatisée à tout changement du code source de façon à s’adapter pour assurer la poursuite de la collecte des mêmes données ?

    Ça m’intéresse, car il m’est déjà arrivé de devoir reprendre un genre de code comme ça parce que le site avait changé l’écriture de ses pages.






    - le code que j’ai proposé apparaît excessivement simple parce que je bénéficie de la facilité d’avoir déjà le texte à analyser, qu’il m’a suffit de placer sous la référence uh.

    Mais en ajoutant les intsructions pour récupérer les données sur le web, ça ne devient pas compliqué pour autant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import re,urllib.request
     
    url = 'http://www.la_ou_je_veux_aller.com'
    sock = urllib.request(url)
    uh = sock.read().decode('coding utilise par le site')
    sock.c;ose()
     
    print(re.findall('<span class="planet-name">(.+?)</span>',uh))
    La méthode decode('coding utilise par le site') est nécessaire parce que j’utilise Python 3 qui télécharge les pages web en un objet de bytes et non pas de caractères.

    C’est tout.









    - Je ne peux pas m’empêcher de faire part de mon impression devant le code Swing rassemblé en début de ce post: outre sa longueur pour faire peu de choses (et encore n’est-il pas complet), ça me laisse pantois de voir une telle profusion de composants:

    • il faut déclarer toutes les variables : franchement le temps qu’on doit passer à ça, on ne finit pas par en avoir une indigestion ?
      Par exemple:
      HTMLDocument.BlockElement elementTrav = null, elementBody = null;être obligé de s’occuper de trucs pareils, ahlala...

    • il faut tout décortiquer en plusieurs échelons...
      []racineHTML.getElement(i).getName().equalsIgnoreCase("body")
      pfff ... Quelle lourdeur !








    -
    Pour ce qui est de l'utilisation du JEditorPane, (...) c'est avant tout un composant swing d'abord destiné à être affiché à l'écran. Le fait qu'il soit capable d'interprèter le code HTML n'a d'interêt pour lui que d'afficher une page HTML comme dans un navigateur. S'en servir pour extraire des valeurs d'un fichier HTML n'est qu'une utilisation détournée de ses fonctionalités.
    Je comprends donc que JEditorPane n’est en fait pas adapté au travail pour lequel tu le proposes, pursang


    Il y a une autre raison de son inadéquation:

    il faut le solliciter pour récupérer un objet de type HtmlDocument qui met à disposition un jeu de méthodes permettant "d'interroger" le document par rapport à son balisage.
    Autrement dit, la détection de ce qu’on cherche passe par une analyse d’un texte sur la base de son organisation par des balises. D’où le problème de parcours de la structure, sans s’y perdre. Et une fois obtenu le contenu d’un élément balisé, ce n’est pas fici, il faut faire une analyse du contenu pour découper le texte aux bons endroits. Quel labeur.

    Alors qu’une regex ne s’embarasse pas de toutes ces cérémonies, elle cherche directement les motifs et en découpe immédiatement (sous forme de groupe) la portion de chaîne de caractères voulue.







    - On ne s’est pas préoccupé de répondre à la question de xnutella. Après tout, pourquoi son code ne produit il qu’une seule valeur recherchée, et non pas les 7 ?

    Je ne vois pas d’itération dans le code de xnutella.
    N’y a-t-il pas de fonction qui fasse une recherche itérative de tous les motifs dans un texte ?

    Il semble que ce soit une difficulté fréquemment rencontrée. Dans le forum Perl, j’ai aussi vu plusieurs fois ce genre de problématique.

  8. #8
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut Bien défendu
    Effectivement eyquem, il n'y a pas de doute sur le fait que dans le cas de la question initiale, l'utilisation d'une expression régulière appliquée sur une lecture texte du fichier ou d'un flux reste sans doute la plus simple et facile à mettre en oeuvre.
    Cependant, au regard du code initial, il me semblait plus propice d'aborder l'aspect HTML de la chose. Je ne maîtrise pas bien ces manipulations, mais l'idée c'est que je reste persuadé que retrouver la valeur d'une balise dans un objet de type HTMLDocument est plus sûr et fait par quelqu'un qui maitrise, cela ne doit pas faire plus que quelques lignes de code. Moi je suis passé par le JEditorPane pour récupérer ce HTMLDocument, il y a probablement plus simple que cela. Ensuite, le document HTMLDocument permet de faire toute sorte de choses comme insérer des valeurs, des balises en enlever etc...
    Quand aux expressions régulières, je n'ai aucun doute sur leur puissance mais la complexité de leur syntaxe qui change d'un langage à l'autre est du moins pour moi un véritable cauchemar. Je ne m'en sert qu'au niveau d'une simple chaîne. Dans ce cas, j'ai raisonné au niveau recherche d'information dans un document.
    Ensuite, lorsque je disais, 3 lignes de code, j'étais éffectivement un peu trop enthousiaste. Encore que, si on y regarde de près, tout ce qui concerne la reconnaissance de la balise concernée ne se trouve que dans le dernier bloc de codes de la boucle de lecture du bloc BODY. Pour finir, il arrive parfois que le code HTML soit généré automatiquement par des outils que ne se donnent pas toujours la peine de faire des retour chariots si bien que de la balise <HTML> à la balise </HTML> on se retrouve avec 'une seule ligne' de texte. Dans ce cas, il faudra bien même avec une expression régulière, du moins pur ce que j'en connais, comptabiliser le nombre de balise recherchée dans la même ligne et les passer en revue une après l'autre...
    Maintenant chacun fait comme il pense, ou plutot comme il comprend, je ne prétend pas avoir la meilleur solution. Et j'avoue ne pas être à l'aise avec les expressions régulières...
    Sinon, pour découper une chaîne à partir d'une expression régulière en java il y a toujours la méthode split de la classe String. On peut l'utiliser de différentes manières et elle découpe en tableaux de chaîne la chaîne initiale en se basant sur une expression régulière. Ne me demandez pas de pondre l'expression qui serait opportune ici, je n'en suis pas capable.
    Je me permettrai de préciser une dernière chose, si demain l'utilisateur décide d'habiller sa petite liste de planètes avec un balisage sans balise fermante comme les puces ou numéros, votre expression régulière récupèrera ce balisage avec la valeur si vous ne l'adaptez pas. Avec la méthode de lecture de l'objet RuntimeElement ce ne sera pas le cas et sans faire la moindre modification. Pourriez-vous nous montrer à quoi ressemblerait l'expression régulière qui récupererait tout ce qui se trouve dans la balise span, mais en enlevant l'éventuelle présence d'un autre balisage comme ce cas par exemple :
    <span class="planet-name"><I>planete terre</I></span>
    voir ça :
    <span class="planet-name"><U><I>planete toto</I></U></span>
    ???
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    fait par quelqu'un qui maitrise, cela ne doit pas faire plus que quelques lignes de code
    Bon, bon.... Mais j’attends de voir le code...
    Ce que j’aime avec Python, c’est que même avec une connaissance très parcellaire de ce langage, j’arrive à faire des choses rapidement ; et de plus, quand c’est pour faire quelque chose de nouveau, je parviens à apprendre ce qu’il faut rapidement et sans excéder les capacités de mes petits neurones.






    le document HTMLDocument permet de faire toute sorte de choses comme insérer des valeurs, des balises en enlever etc...
    je ne conteste pas que ce doit être intéressant de disposer d’un tel outil. Quand c’est nécessaire. J’avoue avoir une petit tendance à vouloir faire les choses par moi même, en codant moi même ce que je veux, et par fainéantise d’apprendre des extensions et des librairies tierces. Mais ça a ses limites. Je demande simplement qu’on reconnaisse que quand il faut faire une chose simple, ça peut être mieux de ne pas s’embarasser avec un gros attirail accompagné d’un manuel de plusieurs dizaines de pages. C’est ce que tu fais au début:
    Effectivement eyquem, il n'y a pas de doute sur le fait que dans le cas de la question initiale, l'utilisation d'une expression régulière appliquée sur une lecture texte du fichier ou d'un flux reste sans doute la plus simple et facile à mettre en oeuvre.
    Mais ensuite, je ne comprends pas ceci:
    il me semblait plus propice d'aborder l'aspect HTML de la chose.
    Et pourquoi donc ? HTML ou pas, un texte est un texte. Si on veut un petit bout du texte , pourquoi s’enquiquiner à tenir compte de sa structure HTML ???







    Quand aux expressions régulières, je n'ai aucun doute sur leur puissance mais la complexité de leur syntaxe qui change d'un langage à l'autre est du moins pour moi un véritable cauchemar.
    Ah oui, c’est un handicap. Pour ma part, j’adore les regex.
    Il est vrai que je ne les utilise pas dans le cadre de plusieurs langages. je les connais surtout en Python, un peu en PHP, je me suis à les étudier en Perl. Ça peut devenir indigeste, je concède.







    si on y regarde de près, tout ce qui concerne la reconnaissance de la balise concernée ne se trouve que dans le dernier bloc de codes de la boucle de lecture du bloc BODY.
    Oui mais si on enlève le reste, ça ne marcherait plus, n’est ce pas ?

    Il y a d'un coté le nombre d’actions qui doivent être réalisées par un programme, mais je ne pensais pas à ça (je ne sais pas comment sont liées le nombre d’actions exécutées et le nombre d’instructions visbles dans le script, d'ailleurs), je pensais d'un autre coté au nombre de caractères qu’il faut taper à la main.







    si bien que de la balise <HTML> à la balise </HTML> on se retrouve avec 'une seule ligne' de texte. Dans ce cas, il faudra bien même avec une expression régulière, du moins pur ce que j'en connais, comptabiliser le nombre de balise recherchée dans la même ligne et les passer en revue une après l'autre...
    passer en revue, c’est bien ce que font la fonction findall() de Python, preg_match_all() de PHP, etc sans se laisser impressioner par la présence ou non de fins de ligne, qui ne sont après tout que des caractéres ’\r’ ou ’\n’ noyés dans le “texte“







    Pourriez-vous nous montrer à quoi ressemblerait l'expression régulière qui récupererait tout ce qui se trouve dans la balise span, mais en enlevant l'éventuelle présence d'un autre balisage comme ce cas par exemple :
    <span class="planet-name"><I>planete terre</I></span>
    voir ça :
    <span class="planet-name"><U><I>planete toto</I></U></span>
    ???
    Ah, très bien, rien de tel qu’un petit défi pour voir de quoi est capable une regex.

    Nuance: une expression régulière n’enlève rien, il faut la définir de façon qu’un groupe capte ce qu l’on veut en évitant de capter ce qu’il y a autour.



    1) Ceci fait ce que tu as demandé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import re
     
    uh = '''voici un bon exercice
    chercher dans <span class="planet-name"><U><I>planete toto</I></U></span> la planete
    toto sans recuperer les balise U et les I'''
     
    RE = '<span .*?planet-name[^>]*>(<([^>]+)>)*([^<]+)(</([^>]+)>)*</span>'
    pat = re.compile(RE)
    print (pat.search(uh).groups())
    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('<I>', 'I', 'planete toto', '</U>', 'U')
    Il suffit de prendre le groupe 3: pat.search(uh).group(3)





    Dans cette RE:

    (<([^>]+)>)* capte les éventuels <U> et <I> et autres <jur647vvd> entre la balise d’ouverture span et ce que l’on veut attraper par ([^<]+)


    Après ([^<]+) , il y a (</([^>]+)>) , avec un / supplémentaire : on pourrait ne pas mettre le / , il serait représenté par [^>] tout aussi bien. Cependant, le mettre augmente la fiabilité de la regex.



    [^>] signifie “n’importe quel caractère , sauf le >

    [^>a9] signifie “n’importe quel caractère sauf les 3 caractères > a 9

    Une paire de crochet définit UN caractère: c’est un point qui est difficilement assimilé car une paire de crochets définit la classe de caractères permis pour LE caractère à la position concernée dans la chaîne explorée.

    Ainsi [7 helix8] permet les caractères 7 8 blanc l i x e h :

    [7 helix8] {4} matche avec ’he78’ , ’h8ix’ , ’l8 8’ etc....

    mais pas avec ’heYi’







    2) La regex construite avec cette RE ne permet cependant pas de capter la portion voulue quand elle comporte le caractère ’<’

    La regex va matcher avec

    ’<span class="planet-name"><U><I>planete to>to</I></U></span>’

    mais pas avec

    <span class="planet-name"><U><I>plan<ete toto</I></U></span>



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import re
    
    uhVV = '''une chaine un peu plus vicieuse
    a cause de < et > dans la portion recherchee
    c'est <span class="planet-name"><U><I>plan<ete toto</I></U></span>jhgfghgdjhyd</span>'''
    
    RE = '<span .*?planet-name[^>]*>(<([^>]+)>)*([^<]+)(</([^>]+)>)*</span>'
    pat = re.compile(RE)
    print (pat.search(uhVV).groups())
    Résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:\Python31\progs 31\balises.py", line 9, in <module>
        print (pat.search(uhVV).groups())
    AttributeError: 'NoneType' object has no attribute 'groups'




    3) Par contre, voici la preuve du danger de ne pas mettre un caractere quand on le peut (ici le /)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import re
     
    uhVV = '''une chaine un peu plus vicieuse
    a cause de < et > dans la portion recherchee
    c'est <span class="planet-name"><U><I>plan<ete toto</I></U></span>jhgfghgdjhyd</span>'''
     
    RE = '<span .*?planet-name[^>]*>(<([^>]+)>)*([^<]+)(<([^>]+)>)*</span>'
    pat = re.compile(RE)
    print (pat.search(uhVV).groups())
    Dans ce code y a plus le /

    Résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('<I>', 'I', 'plan', '</U>', '/U')
    on attrape quelque chose mais ce n'est pas bon.

    « on pourrait ne pas mettre le / , il serait représenté par [^>] tout aussi bien. Cependant, le mettre augmente la fiabilité de la regex.
    »









    4) Pour y arriver, il faut modifier la RE:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import re
     
    uhVV = '''une chaine un peu plus vicieuse
    a cause de < et > dans la portion recherchee
    c'est <span class="planet-name"><U><I>plan<ete toto</I></U></span>jhgfghgdjhyd</span>'''
     
    REVV = '<span .*?planet-name[^>]*>(<([^>]+)>)*(.+)(?(1)</\\2>)(<([^>]+)>)*</span>'
    patVV = re.compile(REVV)
     
    print (patVV.search(uhVV).groups())
    Résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('<I>', 'I', 'plan<ete toto', '</U>', '/U')





    (?(1)</\\2>) signifie ceci:

    (?(1) ... = s’il y a eu un groupe 1 qui a matché quelque chose
    alors est ce qu’on trouve à cette position actuelle un motif </\\2> ?

    Ce motif ce sont le caractère < puis le caractère /
    puis le groupe 2 trouvé (mais ça pourrait être autre chose)
    et enfin le caractere >

    Les groupe 1 et 2 trouvés, ce sont les derniers, quand il y en a plusieurs, en l’occurence '<I>' et 'I'




    On fait suivre (?(1)</\\2>) de (<([^>]+)>)*
    pour matcher avec d'éventuels </quch> supplémentaires (dans notre cas il s'agit de </U> )









    5) Dans un vrai code, on écrira
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import re
     
    uhVV = '''une chaine un peu plus vicieuse
    a cause de < et > dans la portion recherchee
    c'est <span class="planet-name"><U><I>plan<ete toto</I></U></span>jhgfghgdjhyd</span>'''
     
    REVV = '<span .*?planet-name[^>]*>(?:<([^>]+)>)*(.+)(?(1)</\\1>)(?:<(?:[^>]+)>)*</span>'
    patVV = re.compile(REVV)
     
    print (patVV.search(uhVV).groups())
    ?: en tête de portion parenthésée signale en effet: ne pas enregistrer ce contenu de parenthèse dans un groupe.

    resultat
    pour éviter au programme de faire des enregistrements de groupes.

    En n'oubliant pas de changer (?(1)</\\2>) en (?(1)</\\1>) puisque la modification change la numérotation des groupes.




    Avec cette derniere RE, la chaîne recherchée est dans le groupe 2:
    patVV.search(uhVV).group(2)

    Ce qui répond à ta demande.




    NB: c'est 50 fois plus long à expliquer qu’à faire.

    PS Tu peux me tutoyer, le vouvoiement me fait bizarre sur un forum.

    .

  10. #10
    Candidat au Club
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Par défaut
    Je viens de lire l'ensemble des solutions et je retiens que JEditoPane est adapté aà de l'extration dynamique html alors que Regex pour du code Html statique

    merci infinement pour vos reponses je vais pouvoir continuer mon programme.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    xnutella, pourrais tu indiquer à quelle solution es-tu parvenu stp ?

    As tu modifié ton code ?
    As-tu écrit une solution avec JEditorPane ?




    Pour ma part, en cherchant dans la doc Java, j’ai lu ceci:

    public boolean find(): Attempts to find the next subsequence of the input sequence that matches the pattern.
    Perl uses the g flag to request a match that resumes where the last match left off. This functionality is provided implicitly by the Matcher class: Repeated invocations of the find method will resume where the last match left off, unless the matcher is reset.
    Comme je l’ai déjà évoqué , il me semble qu’il manque dans ton code une itération pour répéter la recherche du motif.
    Maintenant, je pense que cette itération doit consister à répéter l’exécution de find sur la chaîne HTML à analyser.

    J’aimerais bien voir quelle solution tu as finalement trouvée.









    Au passage,
    j’aimerais savoir s’il existe en Java une fonction du style find_all_matches() qui assure elle-même une itération dans une chaîne pour trouver tous les matches correspondant à une expression réguliére.

    Une fonction qui évite d’écrire soi-même l’itération du genre


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Pattern p = Pattern.compile("a*b");
    Matcher m = p.matcher("aaaaab");
    b = m.find()
    while b existe:
        faire quelque chose de b
        recommencer b = m.find()






    En outre, en lisant attentivement ton premier post , xnutella, je remarque que ta RE est écrite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String regex = "(net-name\"> )+([a-zA-Z0-9]+)(</span> )+";
    Cette RE ne permet pas à l’objet regex compilé de matcher avec
    <span class="planet-name">Demon3</span>
    Il n’y a a priori aucune raison de répéter (net-name\"> ) et surtout la présence d’un blanc s’oppose à ce que ça matche.





    Qu’est ce que tu entends par extraction dynamique versus extraction statique ??
    .
    .

  12. #12
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 097
    Par défaut Yô !
    Très honnêtement, je n'ai pas tout lu. Mais bravo.
    Je crois que l'on peut dire qu'il ne reste plus qu'à marier les deux, JEditorPane, et les regex....
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

Discussions similaires

  1. problème regex please
    Par mariafan dans le forum Langage
    Réponses: 11
    Dernier message: 03/05/2007, 17h35
  2. [RegEx] Problème regex et caractère \
    Par Kyom dans le forum Langage
    Réponses: 2
    Dernier message: 05/04/2007, 16h07
  3. Problème regex VSFTPD
    Par goldkey dans le forum Réseau
    Réponses: 1
    Dernier message: 19/01/2007, 17h55
  4. [RegEx] Problème regex url cliquable
    Par dorian53 dans le forum Langage
    Réponses: 5
    Dernier message: 16/11/2006, 19h17
  5. [RegEx] Problème Regex PCRE
    Par raptorman dans le forum Langage
    Réponses: 6
    Dernier message: 07/07/2006, 17h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo