一个字符串有多个img如何取出来 ?

本文介绍了一段Java代码,该代码可以从HTML字符串中提取所有图片的源链接,并将它们存储在一个Map中。通过正则表达式匹配<src>属性来实现这一目标。
原址:http://blog.youkuaiyun.com/yuan8080/article/details/6899211 

public static Map<String,String> getImgStr(String htmlStr){
        String img="";
        Pattern p_image;
        Matcher m_image;
        Map<String,String> pics = new HashMap<String, String>();

        //     String regEx_img = "<img.*src=(.*?)[^>]*?>"; //图片链接地址

        String regEx_img = "<img.*src\\s*=\\s*(.*?)[^>]*?>";
        p_image = Pattern.compile
                (regEx_img,Pattern.CASE_INSENSITIVE);
        m_image = p_image.matcher(htmlStr);
        int i=1;
        while(m_image.find()){
            img = img + "," + m_image.group();
            // Matcher m  = Pattern.compile("src=\"?(.*?)(\"|>|\\s+)").matcher(img); //匹配src

            Matcher m  = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img);

            while(m.find()){
                pics.put(String.valueOf(i),m.group(1));
                i++;
            }
        }
        return pics;
    }
    public static  void  main(String[] args) throws  Exception{
        String str="%3Cp%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2F%E9%94%81%E5%BA%93%E5%AD%98%E9%80%9A%E7%9F%A5.jpg%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_01.jpg%22+style%3D%22font-size%3A+12px%3B%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_02.jpg%22+style%3D%22font-size%3A+12px%3B%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_03.jpg%22+style%3D%22font-size%3A+12px%3B%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_04.jpg%22+style%3D%22font-size%3A+12px%3B%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_05.jpg%22+style%3D%22font-size%3A+12px%3B%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_06.jpg%22+style%3D%22font-size%3A+12px%3B%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_07.jpg%22+style%3D%22font-size%3A+12px%3B%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_08.jpg%3Fv%3D233000%22+style%3D%22font-size%3A+12px%3B%22+alt%3D%22%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_09.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_10.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_11.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_12.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_13.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_14.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_15.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_16.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_17.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_18.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_19.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_20.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_21.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_22.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_23.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_24.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_25.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_26.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_27.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_28.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3Cimg+src%3D%22http%3A%2F%2Fwww.haitun.hk%2Fimages%2Fupload%2FImage%2FHEFR002_D_29.jpg%22+alt%3D%22%22+style%3D%22font-size%3A+12px%3B%22+%2F%3E%3C%2Fp%3E";
        Map<String,String> map=    getImgStr(URLDecoder.decode(str,"UTF-8"));
        System.out.println(map.values());
    }


<think>我们正在讨论的是图片链接字符串的大小。图片链接(URL)的大小取决于多个因素,包括域名长度、路径深度、查询参数等。以下是一个分析: ### 影响图片链接字符串大小的因素 1. **域名长度**:常见域名长度在10-30字符之间(如`example.com`为11字符) 2. **路径深度**:如`/images/2024/05/photo.jpg`约25字符 3. **文件名**:通常5-50字符(含扩展名) 4. **查询参数**:可显著增加长度(如`?width=800&height=600`约20字符) 5. **协议前缀**:`https://`占8字符 ### 典型大小范围 | 类型 | 示例 | 字符数 | 字节数(UTF-8) | |------------------|------------------------------------------|-------|----------------| | **简短链接** | `https://a.co/b.jpg` | 18 | 18 | | **中等链接** | `https://example.com/img/photo.png` | 33 | 33 | | **带参数链接** | `https://cdn.example.net/image.jpg?w=600`| 40 | 40 | | **长链接** | `https://.../2024/05/.../high-res.jpg` | 80-150| 80-150 | ### 计算字节大小 在Java中,字符串内存占用计算: ```java String url = "https://example.com/image.jpg"; int byteSize = url.getBytes("UTF-8").length; // 实际存储字节数 ``` ### 优化建议 如需减少链接大小: 1. 使用短域名服务(如`bit.ly`) 2. 缩短路径层级 3. 压缩文件名(如用哈希值替代描述性名称) 4. 移除非必要查询参数 > **注意**:Bundle传输时,字符串以序列化形式存储,实际占用的Bundle空间会比原始字符串略大(Parcel序列化会有额外开销)[^1]。 --- ### 相关问题 1. 如何在Android中准确测量字符串在Bundle中的序列化大小? 2. 传输大量图片URL时如何避免Bundle大小限制? 3. URL字符串的最大长度限制是多少? [^1]: Android Parcel序列化机制分析 </think> ### 图片链接字符串的大小分析 图片链接字符串的大小主要由以下因素决定: #### 1. **基础组成部分** ```mermaid pie title 链接字符串组成占比 “协议” : 8 “域名” : 25 “路径” : 40 “文件名” : 15 “参数” : 12 ``` - **协议部分**:`https://`(8字符)或 `http://`(7字符) - **域名**:通常 10-30 字符(如 `cdn.example.com` = 15字符) - **路径**:平均 20-50 字符(如 `/images/2024/05/15/` = 21字符) - **文件名**:通常 5-30 字符(如 `profile_pic.jpg` = 15字符) - **查询参数**:可选,0-50+ 字符(如 `?width=800&quality=90` = 20字符) #### 2. **典型大小范围** | 类型 | 示例 | 字符数 | 字节大小(UTF-8) | |---------------------|----------------------------------------------------------------------|--------|-----------------| | **基础链接** | `http://example.com/img.png` | 25 | 25 | | **中等CDN链接** | `https://cdn.site.com/images/product/12345.jpg` | 42 | 42 | | **带参数链接** | `https://img.example.net/photo.jpg?w=800&h=600&crop=1` | 48 | 48 | | **长路径链接** | `https://storage.cloud.com/user_uploads/2024/05/15/username_pic.png` | 60 | 60 | | **最大常见链接** | 包含GUID的链接 | 80-120 | 80-120 | #### 3. **字节大小计算原理** 在Java中,字符串内存占用: ```java String url = "https://example.com/image.jpg"; int byteSize = url.getBytes(StandardCharsets.UTF_8).length; // 结果:33字节(示例) ``` > 📌 **关键点**:每个英文字符通常占**1字节**,但中文域名或路径可能使单字符达到**3-4字节**(UTF-8编码) #### 4. **优化建议(如需缩减)** 1. **缩短域名**:使用短域名服务(如 `bit.ly/abc` 代替长链接) 2. **简化路径**:减少目录层级(`/img/pic.jpg` 优于 `/images/2024/05/pic.jpg`) 3. **移除参数**:若非必需,删除查询参数 4. **编码压缩**:对长链接使用Base64(可能增加30%大小但适合特殊场景) #### 5. **Bundle传输注意事项** 当链接放入Android Bundle时: ```java Bundle bundle = new Bundle(); bundle.putString("image_url", url); // 实际占用 = 字符串字节大小 + Parcel序列化开销(约10-20字节) ``` 建议单链接不超过**500字符**(约0.5KB),远低于Bundle 1MB限制[^1]。 --- ### 相关问题 1. 如何在Android中准确测量字符串在Bundle中的序列化大小? 2. 传输大量图片URL时如何避免Bundle大小限制? 3. URL字符串的最大长度限制是多少? [^1]: Android Bundle数据传输限制规范 [^2]: 字符串内存占用计算原理 [^3]: URL结构优化实践
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值