JavaScript如何删除字符串指定子串,无需依赖数字索引截取?
问题解决方案
你不需要强行使用substr()实现需求,这个方法的设计逻辑就是基于索引位置截取内容,本身就不匹配「按指定内容删除子串」的场景,硬用反而要额外写逻辑计算子串位置,还会带来必须固定字符串长度的问题,直接用JS原生提供的字符串处理API就能实现你要的效果,不需要限制文件名长度。
通用指定子串删除实现
两种写法都能实现「传入目标字符串和要删除的子串,直接返回处理后结果」的效果,不需要传位置索引:
// 写法1:split+join 兼容性最好,所有浏览器环境都支持 function deleteSubStr(target, wordsToDelete) { return target.split(wordsToDelete).join(''); } // 写法2:replaceAll 写法更简洁,现代浏览器、Node.js 15+版本原生支持 function deleteSubStr(target, wordsToDelete) { return target.replaceAll(wordsToDelete, ''); }
对应你给出的逻辑示例,用法如下:
const input_value = "hello,world"; const new_input_value = deleteSubStr(input_value, ",world"); // 处理后new_input_value的值为"hello",符合预期
修正后的文件校验代码
你原来写的代码存在关键字大小写错误、引号用了中文全角符号、后缀判断逻辑不准确、初始取值时机不对的问题,修正后完整可运行代码如下:
<input id="extension" type="file"> <script> // 监听文件选择动作,用户选完文件再读取值 document.getElementById('extension').addEventListener('change', function() { const fileName = this.value; const targetExt = '.atkp'; // 用endsWith判断后缀,避免文件名中间包含后缀字符串导致的误判 if (fileName.endsWith(targetExt)) { // 符合后缀要求的处理逻辑写在这里 const nameWithoutExt = deleteSubStr(fileName, targetExt); console.log('移除后缀后的文件名:', nameWithoutExt); } else { alert(`this file can't be accessed since it doesn't have the extention '${targetExt}'.`) } }) function deleteSubStr(target, wordsToDelete) { return target.split(wordsToDelete).join(''); } </script>
注意:判断文件后缀不要用
includes(),如果出现类似test.atkp.txt的文件名,includes()会误判为符合要求,用endsWith()直接校验字符串结尾的内容,判断结果更准确。
内容的提问来源于stack exchange,提问作者gleacc
相关产品推荐
相关产品推荐

