Regex - Recherche d'une URL d'image dans un String

pyo656 Messages postés 34 Date d'inscription lundi 11 septembre 2006 Statut Membre Dernière intervention 19 février 2010 - 7 janv. 2010 à 14:12
pyo656 Messages postés 34 Date d'inscription lundi 11 septembre 2006 Statut Membre Dernière intervention 19 février 2010 - 7 janv. 2010 à 16:19
Bonjour à tous !

Je suis entrain d'essayer de faire une méthode qui ressort toutes les urls d'image d'un code HTML.

J'ai, pour l'instant, utilisé les méthodes indexOf et substring de l'objet String pour rechercher. Voici mon code :

    public static ArrayList recupUrls(String ligne)
    {
        // Contiendra toutes les urls du String
        ArrayList reponse = new ArrayList();
        int taille = ligne.length();
        int i = 0;
        while(i < taille)
        {
            int a = ligne.indexOf("http://",i);
            int b=0;
            if (a > 0 && a+7 < taille) // si a=-1 : pas trouve. Donc a doit être > 0
            {
                b = ligne.indexOf(".jpg",a+7);
                if(b > 0 && b+4 < taille)
                {
                    // On prend ce qu'il y a entre a et b + .jpg
                    String url = ligne.substring(a,b) + ".jpg";
                    // On ajoute a l'arraylist
                    reponse.add(url);
                    i = a + url.length(); // on debutera la prochaine recherche a la fin de la derniere
                    // a est le debut de l'url et on y ajoute la taille de url pour arriver la fin
                }
                else
                    i = taille +1;
            }
            else
                i = taille+1;
        }
        return reponse;
    }


Le problème dans ce code est lorsqu'on tombe sur un string contenant une URL autre qu'une image.
Par exemple : "superBlabla http://www.google.com http://www.google.com/monimage.jpg ratatouille"
Renverra "http://www.google.com http://www.google.com/monimage.jpg"

J'aimerais donc trouver une solution.

J'ai pensé à vérifier chaque caractère qui suit le 'http://' qui a été trouvé. Puis sitôt qu'on tombe sur un espace ' ', un apostrophe ', un guillemet ou un crochet >, on vérifie les 4 caractères précédents et si c'est '.jpg' on fait un substring du début du Http jusqu'à l'indice du g de '.jpg'. Mais cette solution me parait plutôt lourde et laide :D

Merci d'avance pour votre aide !

Pyo

2 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
7 janv. 2010 à 14:39
Salut,

Essaye ceci :

(http://)(\w+/\.-*)+?(\.jpg)

Pas sur... mais c'est un début !


Sébastien FERRAND
Lead Developpeur
Microsoft Visual C# MVP 2005 - 2009
0
pyo656 Messages postés 34 Date d'inscription lundi 11 septembre 2006 Statut Membre Dernière intervention 19 février 2010
7 janv. 2010 à 16:19
Merci de ta réponse Sébastien.

Après avoir posté mon message, j'ai codé une seconde méthode de vérification, de façon récursive. Je me base sur l'hypothèse que le string passé en paramètre commence par http:// et se termine par l'url correcte de mon jpg.

private static String secondeVerification(String base)
    {
        String reponse = "";

        int a = base.indexOf("http://",0);
        int b;
        if(a < 0) reponse = "erreur";
        else
        {
            b = base.indexOf("http://",a+7);
            if(b < 0) // il n'y a pas de deuxieme http
                reponse = base.substring(a,base.length()); // On prend le string a partir du 1er http trouve jusqu'a la fin
            else // il y a un 2ieme http donc on va rappeler la methode en enlevant le 1er http
                reponse = secondeVerification(base.substring(a+7,base.length())); // le substring enleve les 7premiers caractere et prend tt le reste
        }

        return reponse;
    }


C'est certes beaucoup moins joli qu'un petit regex mais je n'ai encore jamais utilisé cette classe en Java (j'y ai touché un peu en Php). Au moins ça marche le temps que je me documente sur les regex en Java et que je puisse tester ce que tu me proposes :)

Pyo
0
Rejoignez-nous