活动介绍
file-type

利用正则表达式提取img标签中的src值方法

ZIP文件

4星 · 超过85%的资源 | 下载需积分: 50 | 30KB | 更新于2025-03-18 | 117 浏览量 | 33 下载量 举报 收藏
download 立即下载
正则表达式(Regular Expression),是一种用来匹配字符串中字符组合的模式。在编写程序或脚本时,经常需要查找符合某些复杂规则的字符串,正则表达式就是用于描述这些规则的工具。本文将详细介绍如何使用正则表达式来匹配HTML中的img标签,并从该标签的src属性中提取URL地址。 首先,要匹配HTML中的img标签,我们可以使用以下正则表达式的基本形式: ``` <img.*?> ``` 这个表达式使用了尖括号来匹配img标签的开始和结束,并使用了懒惰量词(.*?)来尽可能少地匹配任意字符。这样设计是为了尽量避免跨越多个img标签,保持匹配的准确性。 但是,这个表达式还不足以精确匹配,因为HTML标签中可能包含各种属性,仅匹配到开始标签是不够的。为了精确匹配整个img标签,我们需要使用更加复杂的正则表达式,如下所示: ``` <\s*img\s+[^>]*src\s*=\s*["']?([^\s"'>]+) ``` 让我们拆解这个正则表达式中的各个部分来更好地理解它的含义: - `<\s*img\s+`:匹配<后跟任意数量的空白字符(包括空格、制表符等),接着是img,再后是至少一个空白字符,确保匹配到标签开始。 - `[^>]*`:匹配任意数量的非>字符,直到遇到src属性。 - `src\s*=\s*`:匹配src属性的名称和等号,其中等号前后可以有任意数量的空白字符。 - `["']?`:匹配可能存在的引号字符(单引号或双引号),出现零次或一次,表示src值可以使用引号包围也可以不使用。 - `([^\s"'>]+)`:捕获组,匹配src属性的值。这个值由一个或多个非空白字符、引号、>等字符组成的序列。 - `>`:匹配标签的结束尖括号。 需要注意的是,正则表达式虽然功能强大,但并不擅长处理所有类型的HTML文本。在复杂的HTML文档中,属性值可能包含引号或者没有引号,或者使用了HTML实体等,这会使正则表达式匹配变得复杂和不可靠。因此,在处理复杂的HTML文档时,推荐使用专门的HTML解析器来获取所需数据。 再来看【压缩包子文件的文件名称列表】中提供的文件名“匹配img标签_匹配src中的值”。这个名字直接指明了文档的主题,即如何利用正则表达式匹配img标签并提取其src属性中的URL。这种文件通常可以作为代码库中的一个函数或者脚本库的一部分,当需要在大量文本中寻找特定的图片资源链接时,可以调用这个功能。 总结来说,通过正则表达式匹配img标签并提取src属性中的值是一个常见的文本处理任务,尤其在网页爬虫和数据采集领域应用广泛。掌握了相关知识后,可以编写出高效的脚本,帮助自动化完成复杂的网页内容分析和处理任务。不过需要注意,正则表达式在解析复杂HTML文档时可能不够健壮,因此在实际应用中还需结合HTML解析工具,以提高处理的准确性和效率。

相关推荐

filetype

static void music_page_update_msg() { std::string music_name; std::string music_singer; std::vector<char> music_cover_vec; bool play_status; g_box->GetMusicMSG(music_name, music_singer, music_cover_vec, play_status); // if(play_status){ // lv_obj_set_style_bg_img_src(action_get_obj(WIDGET_ID_IDC_MUSIC_PLAY_STATUS), &img_idb_music_play,0); // }else { // lv_obj_set_style_bg_img_src(action_get_obj(WIDGET_ID_IDC_MUSIC_PLAY_STATUS), &img_idb_music_pause,0); // } lv_label_set_text(action_get_obj(WIDGET_ID_IDC_MUSIC_NAME), music_name.data()); lv_label_set_text(action_get_obj(WIDGET_ID_IDC_MUSIC_SINGER), music_singer.data()); //获取封面容器 lv_obj_t *img_container = action_get_obj(WIDGET_ID_IDC_MUSIC_COVER); //设置容器尺寸为正方形,并启用圆角 lv_obj_set_size(img_container, 240, 240); lv_obj_set_style_radius(img_container, LV_RADIUS_CIRCLE, 0); //开启裁剪圆角(clip_corner),让子对象也被裁剪 lv_obj_set_style_clip_corner(img_container, true, 0); //准备图片数据缓冲 if (music_cover) { free(music_cover); music_cover = NULL; } music_cover = (uint8_t*)malloc(music_cover_vec.size()); std::copy(music_cover_vec.begin(), music_cover_vec.end(), music_cover); //构造 lv_img_dsc_t music_cover_bg_dsc.header.always_zero = 0; music_cover_bg_dsc.header.cf = LV_IMG_CF_UNKNOWN; music_cover_bg_dsc.header.w = 240; music_cover_bg_dsc.header.h = 240; music_cover_bg_dsc.data_size = music_cover_vec.size(); music_cover_bg_dsc.data = music_cover; //创建图片对象 // img_obj = NULL; if (!img_obj) { img_obj = lv_img_create(img_container); // lv_obj_set_size(img_obj, 240, 240); lv_img_set_size_mode(img_obj, LV_IMG_SIZE_MODE_REAL); // lv_img_set_zoom(img_obj, 256); } // lv_res_t info = lv_img_decoder_get_info(&music_cover_bg_dsc, &music_cover_bg_dsc.header); // printf("ret_info:%d\n",(int)info); // printf("cf:%d w:%d h:%d size:%d\n",(int)music_cover_bg_dsc.header.cf, (int)music_cover_bg_dsc.header.w, (int)music_cover_bg_dsc.header.h, (int)music_cover_bg_dsc.data_size); // lv_img_src_t src_type = lv_img_src_get_type(&music_cover_bg_dsc); // printf("src_type:%d\n",(int)src_type); lv_img_set_src(img_obj, &music_cover_bg_dsc); int32_t container_w = lv_obj_get_width(img_container); int32_t container_h = lv_obj_get_height(img_container); int32_t img_w = music_cover_bg_dsc.header.w; int32_t img_h = music_cover_bg_dsc.header.h; // 计算缩放比例(保持宽高比) uint16_t scale_factor = 256 * std::min( (float)container_w / img_w, (float)container_h / img_h ); lv_img_set_zoom(img_obj, scale_factor); // 居中图片 lv_obj_center(img_obj); printf("Image size: %d x %d\n", (int)img_w, (int)img_h); printf("Scale factor: %d\n", (scale_factor)); printf("Container size: %d x %d\n", (int)container_w, (int)container_h); } 我图片大小实际上是600*600,但是现在写死成240*240为什么这样可以显示呢,

filetype
filetype

C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c: In function 'create_screen_log': C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:157:29: error: implicit declaration of function 'lv_image_create'; did you mean 'lv_img_create'? [-Wimplicit-function-declaration] 157 | lv_obj_t *obj = lv_image_create(parent_obj); | ^~~~~~~~~~~~~~~ | lv_img_create C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:157:29: error: initialization of 'lv_obj_t *' {aka 'struct _lv_obj_t *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:160:13: error: implicit declaration of function 'lv_image_set_src'; did you mean 'lv_img_set_src'? [-Wimplicit-function-declaration] 160 | lv_image_set_src(obj, &img_yaskawa_log); | ^~~~~~~~~~~~~~~~ | lv_img_set_src C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c: In function 'create_screen_test_main': C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:247:29: error: implicit declaration of function 'lv_button_create'; did you mean 'lv_btn_create'? [-Wimplicit-function-declaration] 247 | lv_obj_t *obj = lv_button_create(parent_obj); | ^~~~~~~~~~~~~~~~ | lv_btn_create C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:247:29: error: initialization of 'lv_obj_t *' {aka 'struct _lv_obj_t *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:266:29: error: initialization of 'lv_obj_t *' {aka 'struct _lv_obj_t *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 266 | lv_obj_t *obj = lv_button_create(parent_obj); | ^~~~~~~~~~~~~~~~ C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:284:29: error: initialization of 'lv_obj_t *' {aka 'struct _lv_obj_t *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 284 | lv_obj_t *obj = lv_button_create(parent_obj); | ^~~~~~~~~~~~~~~~ C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:303:29: error: initialization of 'lv_obj_t *' {aka 'struct _lv_obj_t *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 303 | lv_obj_t *obj = lv_button_create(parent_obj); | ^~~~~~~~~~~~~~~~ C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c: In function 'create_screen_test_inv': C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:361:29: error: initialization of 'lv_obj_t *' {aka 'struct _lv_obj_t *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 361 | lv_obj_t *obj = lv_button_create(parent_obj); | ^~~~~~~~~~~~~~~~ C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:388:29: error: initialization of 'lv_obj_t *' {aka 'struct _lv_obj_t *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 388 | lv_obj_t *obj = lv_button_create(parent_obj); | ^~~~~~~~~~~~~~~~ C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:443:29: error: initialization of 'lv_obj_t *' {aka 'struct _lv_obj_t *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 443 | lv_obj_t *obj = lv_button_create(parent_obj); | ^~~~~~~~~~~~~~~~ C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c: In function 'create_screen_test_iic': C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:518:29: error: initialization of 'lv_obj_t *' {aka 'struct _lv_obj_t *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 518 | lv_obj_t *obj = lv_button_create(parent_obj); | ^~~~~~~~~~~~~~~~ C:/TPC/IOT/IoT_Pad_MIC_Test/AI_Pad_Test/Src/main/ui/screens.c:536:29: error: initialization of 'lv_obj_t *' {aka 'struct _lv_obj_t *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 536 | lv_obj_t *obj = lv_button_create(parent_obj);

filetype