HTML Image Picker - String Filter Problem

D

dark staple

Neues Mitglied
0
Hallo zusammen,
ich bin gerade dabei ein ImagePicker zu schreiben nur leider bekomme ich es nicht ganz hin.

Also ich habe vor Webseite X auszulesen und mit von einem bestimmten Bild die src ausgeben zu lassen, damit ich es anzeigen kann.
Der Code durchläuft das HTML soll nach <img src="www.xy.de/lustigesbild.png" /> suchen und mir dann nur www.xy.de/lustigesbild.png zurückgeben...

Das auslesen des HTML funktioniert schon :)

Das Problem ist der RegEx, wenn ich versuche den String zu filtern, damit ich nur die src habe, stürzt die app ab...
Vielleicht hat ja einer von euch eine Idee?

Vielen Dank

Code:
public void onButtonClick(View view) {
        switch (view.getId()) {
        case R.id.sf_aussenwelt_internet_go:
            String text = "";
            String imgRegex = "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>";
            
            try {
                URL ucon = new URL("http://www.xyz.de/");
                URLConnection uconn;
                uconn = ucon.openConnection();
                uconn.connect();
                
                InputStream is = uconn.getInputStream();
                
                BufferedReader fileInBuffer =
                        new BufferedReader( new InputStreamReader(is));
                String zeile;
                try {
                    while ((zeile = fileInBuffer.readLine()) != null) {
                        text += zeile;
                    }
                         Pattern p = Pattern.compile(imgRegex);
                         Matcher m = p.matcher(text);

                            if(m.find())
                            {
                                text = m.group(1);
                            }

                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    fileInBuffer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            textEingabe.setText(text);
            
            break;
        }
    }
 
Zuletzt bearbeitet:
versuch mal den hier:
Code:
<img[^>]src=["']([^'"]*)

Musst noch beachten, dass das Bild auch (vermutlich hauptsächlich) relativ angegeben ist, also beim laden noch das "http://www.xyz.de/" davor schreiben wenn nötig.

edit: Achso, natürlich noch entsprechend die " escapen
- und statt dem "text += zeile;" -> StringBuilder nehmen, geht bei großen Daten deutlich zügiger, als jedesmal nen neues String-Objekt zu erstellen ;)
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: dark staple
Also vielen Dank erstmal :)
Das Funktioniert soweit schon mal ganz gut bei vielen Bildern aber....
<img alt="foo bar foo" data-orig height="558" width="800" id="image" onclick="Note.toggle();" src="xsq.de/bla.png">Das erkennt er leider nicht mehr :(

Alle anderen Bilder auf der Webseite werden erkannt, nur dieses nicht...

Was genau meintest du mit StringBuilder nehmen?
 
Oh, es fehlte nen * :)

Code:
<img[^>]*src=["']([^'"]*)



Statt deinem
Code:
String text;
nimmste 'nen StringBuilder:
Code:
StringBuilder text = new StringBuilder();
dann statt dem "text+=zeile"
Code:
text.append(zeile);

Den gesamten Text kriegste dann per
Code:
text.toString();

Das "Problem" wenn du Strings per += aneinanderfügst ist, dass für jede Zeile eine neues String-Objekt (also das zusammengesetzte) erzeugt wird. Bei vielen Zeilen ist das Recht inperformant :>

mehr dazu Java ist auch eine Insel: StringBuilder/StringBuffer
 
Also das ist mein aktueller Code, leider findet er immer noch nicht alle Bilder :(

Vielleicht hat noch jemand eine Idee?

Trotzdem noch mal vielen Dank :)

Code:
public void onButtonClick(View view) {
        switch (view.getId()) {
        case R.id.sf_aussenwelt_internet_go:
            String adresse = mEditText.getText().toString();
            
            //String imgRegex = "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>";
            String imgRegex = "<img[^>]*src=[\"']([^'\"]*)";
            StringBuilder text = new StringBuilder();
            
            try {
                URL ucon = new URL("xyz.de");
                URLConnection uconn;
                uconn = ucon.openConnection();
                uconn.connect();
                
                InputStream is = uconn.getInputStream();
                
                BufferedReader fileInBuffer =
                        new BufferedReader( new InputStreamReader(is));
                String zeile;
                try {
                    while ((zeile = fileInBuffer.readLine()) != null) {
                        text.append(zeile);
                    }
                         Pattern p = Pattern.compile(imgRegex);
                         Matcher m = p.matcher(text.toString());
                         text.delete(0, text.length());
                            if(m.find())
                            {
                                int i = 0;
                                while(i != m.groupCount()+1)
                                {
                                text.append(m.group(i).replace("<img src=\"", ""));
                                //text.replacereplace("<img src=\"", "");
                                i++;
                                }
                            }

                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    fileInBuffer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            textEingabe.setText(text.toString());
            
            break;
        }
    }

EDIT: While Schleife vergessen...
 
Zuletzt bearbeitet:
Lösung:

Code:
private ImageView mImageView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.aussenwelt_internet);
        mImageView  = 
                (ImageView) findViewById(R.id.sf_aussenwelt_internet_image);
    }

    public void onButtonClick(View view) {
        switch (view.getId()) {
        case R.id.sf_aussenwelt_internet_go:
            String adresse = "http://www.example.de/data/show/8731928534/";
            String imgRegex = ".*src=\"(.+?)\".*";
            String urlString = "";
            
            try {
                URL ucon = new URL(adresse);
                URLConnection uconn;
                uconn = ucon.openConnection();
                uconn.connect();
                
                InputStream is = uconn.getInputStream();
                
                BufferedReader fileInBuffer =
                        new BufferedReader( new InputStreamReader(is));
                String zeile;
                try {
                    while ((zeile = fileInBuffer.readLine()) != null) {
                            Pattern p = Pattern.compile(imgRegex);
                            Matcher m = p.matcher(zeile);
                            if(m.find()) {
                                int i = 0;
                                while(i != m.groupCount()+1)
                                {
                                    // startsWith, damit das richtige  Bild ausgewählt wird, nämlich das Hauptbild das liegt relativ unter  /data/
                                    if(m.group(i).startsWith("/data")) {
                                        urlString = "http://www.example.de" + m.group(i);
                                    }
                                    i++;
                                }
                            }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    fileInBuffer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            try {
                mImageView.setImageDrawable(
                    Drawable.createFromStream(
                            (InputStream) new URL(urlString).getContent(), 
                            "Hauptbild")
                );
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            break;
        }
    }
 
Zuletzt bearbeitet:

Ähnliche Themen

W
  • WuDiDong
Antworten
3
Aufrufe
766
jogimuc
J
J
Antworten
0
Aufrufe
692
JoEntwickler
J
E
Antworten
4
Aufrufe
1.222
enrem
E
Zurück
Oben Unten