1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

HTML Image Picker - String Filter Problem

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von dark staple, 12.08.2011.

  1. dark staple, 12.08.2011 #1
    dark staple

    dark staple Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    12.08.2011
    Phone:
    HTC Magic
    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: 12.08.2011
  2. sixi, 12.08.2011 #2
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    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: 12.08.2011
    dark staple bedankt sich.
  3. dark staple, 12.08.2011 #3
    dark staple

    dark staple Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    12.08.2011
    Phone:
    HTC Magic
    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?
     
  4. sixi, 12.08.2011 #4
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    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
     
  5. dark staple, 12.08.2011 #5
    dark staple

    dark staple Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    12.08.2011
    Phone:
    HTC Magic
    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: 12.08.2011
  6. dark staple, 15.08.2011 #6
    dark staple

    dark staple Threadstarter Neuer Benutzer

    Beiträge:
    5
    Erhaltene Danke:
    0
    Registriert seit:
    12.08.2011
    Phone:
    HTC Magic
    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: 15.08.2011

Diese Seite empfehlen