如何从指定URL提取dealetePosts与.jpg间的字符串?现有方案是否最优?
问题:从Cloudinary URL中提取指定片段
有如下格式的URL:
https://res.cloudinary.com/xyzzz/image/upload/v1673615977/dealetePosts/hokhqmcmmkveqhxtr0nb.jpg
如何从中提取hokhqmcmmkveqhxtr0nb?也就是提取dealetePosts和.jpg之间的内容。
用字符串定位加substring的方法可行,但有没有更简便的方式?我目前实现了如下可行的代码,但这是最优方案吗?
const publicID = dealPic.substring( dealPic.indexOf("dealetePosts/") + 13, dealPic.lastIndexOf(".jpg") );
几种更简便的实现方式
正则表达式匹配:
直接用正则精准捕获目标片段,代码简洁直观:const matchResult = dealPic.match(/dealetePosts\/(.*)\.jpg/); const publicID = matchResult ? matchResult[1] : '';原理:
dealetePosts\/匹配固定前缀,(.*)捕获两者之间的所有内容,\.jpg匹配后缀,最终取捕获到的第一个分组结果即可。如果URL格式固定,这种方式最省心。URL对象拆分路径:
借助浏览器原生的URL对象解析路径,再通过分割路径片段来定位目标,适配性更强:const urlObj = new URL(dealPic); const pathParts = urlObj.pathname.split('/'); const folderIndex = pathParts.indexOf('dealetePosts'); const publicID = folderIndex !== -1 ? pathParts[folderIndex + 1].replace('.jpg', '') : '';这种方式不用硬编码字符串长度,哪怕后续路径层级微调,只要
dealetePosts这个文件夹名不变,就能正常提取。对你当前代码的评价:
你现在的代码完全能用,但存在两个小隐患:一是+13是硬写的dealetePosts/长度,万一这个文件夹名改了,代码直接失效;二是只针对.jpg后缀,如果后续出现其他图片格式,就得修改代码。如果你的业务场景里前缀和后缀永远不会变,当前方案没问题,但要追求健壮性的话,上面两种方式更优。
内容的提问来源于stack exchange,提问作者Kal
相关产品推荐
相关产品推荐

