js

js补充正则

js课程
ecma 19课 非常重要,足以满足笔试
dom 笔试 22节课程 50%与笔试相关,包括实战

这两个看会
js补充,至少20
js高级20
js一共79节课程,平均每节课1个半小时
这79节是必须掌握好的,其它的都是陪衬,必须要掌握好的
其它的都是随着js可以了,之后再慢慢去弄的东西

陪衬并不是一点都不重要,意思是与js本身相比不重要,不如js重要,与js本身比重要性太低了,(前端)学任何东西的基础都是js,学好任何东西的基础也是js

正则实战

去除input空格

  1. <input type="text" id="test" onkeyup="test(this)">
  2. <button>点击</button>
  3. <script !src="">
  4. var oTest = document.getElementById("test");
  5. function test(obj){
  6. var reg=/\s/;
  7. obj.value=obj.value.replace(reg, '');
  8. }
  9. </script>

image.png
\s空格,space

输入时空格检测,点击按钮提交空格检测,提交给后端,后端空格检测,检测三遍
因为每打一个空格会删一个,所以不用加g,也可以加个g全局

传到后端有空格,即使前端检测了,即使前端做了再多检测,后端也需要检测。
因为有可能、假设有人得到了接口协议,直接发数据给后端,这样前端检测就没有用处了,上面程序input检测,数据不经过input,前端检测就没有用处。
在提交的同时注入一个程序,让提交给后端的程序有空格,改变传给后端数据,xs,ss等很多方法都可以做到,用注入的形式。数据合法性,后端一定会再去验证,因为前端是极度不安全的,后端一定不会100%相信的。
后端从前端传过来的数据,前端没有必要不信任,因为是从安全的地方传到不安全的地方,对数据没有必要再检验了。前端数据到后端,是从不安全的地方,传到安全的地方,所以安全的地方肯定不信任不安全的地方,要结果检测。
后端是不能相信前端传过来的东西的,一定要验证一下传过来的数据。

\d数字,\D非数字。

思路
不想让输入哪个数据,就匹配哪个数据,把那个数据替换成空。

不如输入数字,是用户体验。如果不是为了用户体验,只在点击按钮时做出判断就可以了。

身份证验证

  1. <input type="text" id="test">
  2. <button onclick="test()">点击</button>
  3. <script !src="">
  4. /*
  5. //22050219960430003x 220502六位 19960430八位 003x分成3部分去做,3段去做
  6. ^[1-9]\d{5} 首字母不为0,6位
  7. */
  8. var oTest = document.getElementById("test");
  9. function test() {
  10. var val = oTest.value,
  11. // reg=/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|1[0-2]))(([0-2][1-9])|([10|20|30|31]))/;
  12. reg = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(10|1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[1-9Xx]$/,
  13. pass = reg.test(val);
  14. console.log(pass)
  15. }
  16. </script>

这个验证也不是最全的验证,身份证还有很多规则,还有一些需要验证,比如2月不能有31天,前端不要特别去验证,后端主要去验证。
这个正则太长了,记不住,就得多写,才能记住
\w包括拉丁文等别的文,一般不用,一般用[0-9A-Za-z]

至少6位,包含一个大写,1个小写,1个数字,1个特殊

至少6位,包含一个大写,1个小写,1个数字,1个特殊
?=正向预查 正向断言

  1. function test() {
  2. var val = oTest.value,
  3. reg=/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!_~!@#$%^&*?]).*$/,
  4. pass = reg.test(val);
  5. console.log(pass)
  6. }

每个里面都有个条件

这个要写出来,要会写,这只是基本的东西
但正则只用写一次,以后都用一样的就行了

  1. <input type="file" onchange="test2(this)" id="file">
  2. <script !src="">
  3. var oTest = document.getElementById("test");
  4. function test2(obj) {
  5. var val = obj.value,
  6. reg = /k/;
  7. console.log(val);
  8. /*
  9. C:\fakepath\TickTick.exe
  10. C:\fakepath\api-ms-win-core-heap-l1-1-0.dll
  11. C:\fakepath\taobao.png
  12. 为了验证是不是图片,如果是图片把图片上传
  13. */
  14. }
  15. </script>
  1. <input type="file" onchange="test2(this)" id="file">
  2. <script !src="">
  3. var oTest = document.getElementById("test");
  4. function test2(obj) {
  5. var val = obj.value,
  6. // reg = /(.jpg|.gif|.png|.jpeg)/,
  7. reg = /(\.jpg|\.gif|\.png|\.jpeg)/,
  8. pass = reg.test(val);
  9. console.log(val);
  10. console.log(pass);
  11. /*
  12. C:\fakepath\TickTick.exe
  13. C:\fakepath\api-ms-win-core-heap-l1-1-0.dll
  14. C:\fakepath\taobao.png
  15. */
  16. }
  17. </script>

image.png
webp从后端转换的,前端上传不传webp
因为可能.jpg后面有参数

用户名校验

  1. <input type="text" id="test">
  2. <button onclick="test()">点击</button>
  3. <script !src="">
  4. var oTest = document.getElementById("test");
  5. function test() {
  6. var val = oTest.value,
  7. // reg = /[0-9A-z_-]{4,16}/,
  8. reg = /^[0-9A-z_-]{4,16}$/,
  9. pass = reg.test(val);
  10. console.log(val);
  11. console.log(pass);
  12. }
  13. </script>

image.png

整数

正整数

image.png

  1. <script !src="">
  2. var reg=/^\d+$/;
  3. console.log(reg.test('123'));//true
  4. console.log(reg.test('123.2'));//false
  5. console.log(reg.test('-123'));//false
  6. </script>

负数

  1. <script !src="">
  2. var reg=/^-\d+$/;
  3. console.log(reg.test('123'));//false
  4. console.log(reg.test('-123.2'));//false
  5. console.log(reg.test('-123'));//true
  6. </script>

整数

  1. <script !src="">
  2. var reg=/^-?\d+$/;
  3. console.log(reg.test('123'));//true
  4. console.log(reg.test('-123.2'));//false
  5. console.log(reg.test('-123'));//true
  6. </script>

-?负号出现一次或者两次
?在正则里面是万能的感觉,?可以正向预查,可以变成非贪婪模式,可以出现0至1次,可以当特殊字符,它的作用其实是最大的

邮箱校验

xxxxxxxxxxxxxx@xxxx.com.cn

  1. <input type="text" id="test">
  2. <button onclick="test()">点击</button>
  3. <script !src="">
  4. var oTest = document.getElementById("test");
  5. function test() {
  6. var val = oTest.value,
  7. reg = /^([A-z0-9_-])+\@([A-z0-9_\-\.]+\.([A-z{2,4}]))$/,
  8. pass = reg.test(val);
  9. console.log(val);
  10. console.log(pass);
  11. }
  12. </script>

?:

  1. var str='abcabc',
  2. reg=/(b)(c)/;
  3. console.log(str.match(reg));

image.png
匹配bc,也会把b、c分别匹配
这叫做捕获分组

  1. var str = 'abcabc',
  2. reg=/(a)(b)(c)/;
  3. console.log(str.match(reg));

image.png

  1. var str = 'abcabc',
  2. reg=/(?:a)(b)(c)/;
  3. // reg=/a(b)(c)/;
  4. console.log(str.match(reg));

image.png
不想捕获a ,就加个?:
(?:a)参与匹配,只不过不会单独把它匹配出来