首页 > 解决方案 > 字符串拆分以捕获图像 URL

问题描述

我正在寻找拆分类似于此的字符串:

"I/ContentValues: InputLine {"batchcomplete":"","query":{"pages":{"24437894":{"pageid":24437894,"ns":0,"title":"Boston","thumbnail":{"source":"https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Massachusetts_State_House_-_panoramio_%281%29.jpg/250px-Massachusetts_State_House_-_panoramio_%281%29.jpg","width":250,"height":166},"pageimage":"Massachusetts_State_House_-_panoramio_(1).jpg"}}}}

我想要的只是图像的超链接:

https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Massachusetts_State_House_-panoramio%281%29.jpg/250px-Massachusetts_State_House_-panoramio%281%29.jpg

在 C 中很容易做到这一点。通过使用 right(":",7),它将解析出第 7 个 ":" 之后的所有内容。
但是,我似乎在 Java 中找不到类似的东西。

我尝试了以下代码但没有成功:

捕获 HTML 字符串的代码

bandName = artist.artistName;
        bandName = bandName.replace(' ','_');
        try {
            getUrlSource("https://en.wikipedia.org/w/api.php?action=query&titles="+bandName+"&prop=pageimages&format=json&pithumbsize=250");
        } catch (IOException e) {
            e.printStackTrace();
        }

我尝试解析它

private void getUrlSource(String site) throws IOException {
        URL url = new URL(site);
        Log.i(TAG, "Web Address " + site);
        URLConnection urlc = url.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                urlc.getInputStream(), "UTF-8"));
        String inputLine;

        StringBuilder a = new StringBuilder();
        while ((inputLine = in.readLine()) != null)
        

a.append(inputLine);
    Log.i(TAG, "InputLine " + a);
    in.close();
    String value = a.substring(a.indexOf("source\":")+1,
            a.indexOf("\",", a.indexOf(",")+1));
    Log.i(TAG, "Web Address " + value);

    //webView.loadUrl(value);
}

日志猫

2020-10-08 13:29:09.328 18746-18746/com.rvogl.androidaudioplayer I/TetheringManager: registerTetheringEventCallback:com.rvogl.androidaudioplayer
2020-10-08 13:29:09.346 18746-18851/com.rvogl.androidaudioplayer W/chromium: [WARNING:dns_config_service_posix.cc(341)] Failed to read DnsConfig.
2020-10-08 13:29:09.423 18746-18746/com.rvogl.androidaudioplayer I/ContentValues: Web Address https://en.wikipedia.org/w/api.php?action=query&titles=Boston&prop=pageimages&format=json&pithumbsize=250
2020-10-08 13:29:09.469 18746-18759/com.rvogl.androidaudioplayer I/roidaudioplaye: Background concurrent copying GC freed 9670(1027KB) AllocSpace objects, 3(60KB) LOS objects, 49% free, 4107KB/8214KB, paused 268us total 159.378ms
2020-10-08 13:29:09.689 18746-18746/com.rvogl.androidaudioplayer I/ContentValues: InputLine {"batchcomplete":"","query":{"pages":{"24437894":{"pageid":24437894,"ns":0,"title":"Boston","thumbnail":{"source":"https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/Massachusetts_State_House_-_panoramio_%281%29.jpg/250px-Massachusetts_State_House_-_panoramio_%281%29.jpg","width":250,"height":166},"pageimage":"Massachusetts_State_House_-_panoramio_(1).jpg"}}}}
2020-10-08 13:29:09.690 18746-18746/com.rvogl.androidaudioplayer E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.rvogl.androidaudioplayer, PID: 18746
    java.lang.StringIndexOutOfBoundsException: String index out of range: -17
        at java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:935)
        at java.lang.StringBuilder.substring(StringBuilder.java:77)
        at com.rvogl.androidaudioplayer.fragments.ArtistDetailsFragment.getUrlSource(ArtistDetailsFragment.java:165)
        at com.rvogl.androidaudioplayer.fragments.ArtistDetailsFragment.setDetails(ArtistDetailsFragment.java:124)
        at com.rvogl.androidaudioplayer.fragments.ArtistDetailsFragment.onCreateView(ArtistDetailsFragment.java:100)

任何帮助将不胜感激

标签: javascriptjavaandroidregex

解决方案


在您使用子字符串的部分中,我使用了这样的方法。

    public static StringBuilder cutImg(StringBuilder split){
        int start=split.indexOf("\"source\":")+new String("\"source\":").length();
        split.delete(0, start);
        split.delete(split.indexOf(","), split.length());
        return split;
    }

有很多方法可以做到这一点,但我仍然不了解 URL 的完整语法,因此如果语法不同,它可能会抛出异常。


推荐阅读