1. dark staple, 12.08.2011 #1
    dark staple

    dark staple Threadstarter Neuer Benutzer

    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

    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

    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

    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

    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

    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