zoukankan      html  css  js  c++  java
  • 浅谈 js字符串 trim 方法之正则篇

     关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^s+|s+$/ 就可以搞定了。
    而且支持中文空格   等等。
    什么 s 支持 中文空格?
    是的。

    打开 RegExp#character-classes 往下拉一点,找到 s 这个解释。

    原文:
    Matches a single white space character, including space, tab, form feed, line feed and other Unicode spaces. Equivalent to [ f vu00a0u1680u180eu2000u2001u2002u2003u2004u2005u2006u2007u2008u2009u200au2028u2029u202fu205fu3000].

    谷歌译文:
    匹配单个空白字符,包括空格,制表符,换页,换行等Unicode的空格。
    相当于 [ f vu00a0u1680u180eu2000u2001u2002u2003u2004u2005u2006u2007u2008u2009u200au2028u2029u202fu205fu3000]

    其中 u00a0 是   u3000 是 中文空格,其他是什么,我也不知道,有兴趣的可以自己去翻 unicode 表。

    看到这,已经颠覆了我们传统正则的规范了,以前,我们只知道 s 等价于 [ f v],但却不知道现在的js里却等价于所有空白字符。
    话虽如此,但是低版本却一直是 [ f v],甚至连 trim 都木有,所以我们要兼容低版本的话,不能简单的用 /^s+|s+$/ 处理了,要加上中文空格 和   
    所以要 /^[su3000u00A0]+|[su3000u00A0]+$/ 才行,这样常用的就有了,至于那些 u2000 之类的,我也不知道是什么,可以按需添加进去。
    常用的无非就中文空格和实体空格了。

    我们看下 jQuery 是怎么处理这个的。

    1. // 1.4.1
    2. rtrim = /^(s|u00A0)+|(s|u00A0)+$/g,
    3. // 1.5.1, 1.6.1, 1.7.1
    4. trimLeft = /^[sxA0]+/;
    5. trimRight = /[sxA0]+$/;
    6. // 1.8.1, 1.9.1, 1.10.1, 1.11.1
    7. rtrim = /^[suFEFFxA0]+|[suFEFFxA0]+$/g,
    复制代码


    好吧,1.4-1.7 都一样,值去除普通空格和实体空格。
    1.8-1.11 加了一个 uFEFF ,这个是什么东西呢?
    jQuery 的注释写到 Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
    译为: 确保去除 BOM 和   (请看你的 Safari 5.0 and IE)
    什么 BOM ?为什么会出现 BOM ?
    这东西一般人是打不出来的,为什么要去除这个呢? 
    PS:这里的BOM是 字节顺序标记(byte-order mark),不清楚的,请翻阅这里 字节顺序标记 。

    我也不知道,最近翻不了墙,所以懒得找了。
    但是他不去除中文空格这有点说不过去了,难道他们不会中文,就无视中文空格么?
    所以我们应该优化下这个正则 /^[su3000uFEFFxA0]+|[su3000uFEFFxA0]+$/g 这样才对嘛。

    来看下原生 trim 和我们正则去除结果如何吧:

    1. var rtrim = /^[su3000uFEFFxA0]+|[su3000uFEFFxA0]+$/g;
    2. console.log( "普通空格测试:" );
    3. console.log( "'" + " 普通空格 ".replace(rtrim, "") + "'" );
    4. console.log( "'" + " 普通空格 ".trim() + "'" );
    5. console.log( "实体空格测试:" );
    6. console.log( "'" + " u00a0 实体空格 u00a0 ".replace(rtrim, "") + "'" );
    7. console.log( "'" + " u00a0 实体空格 u00a0 ".trim() + "'" );
    8. console.log( "中文空格测试:" );
    9. console.log( "'" + "   中文空格   u3000".replace(rtrim, "") + "'" );
    10. console.log( "'" + "   中文空格   u3000".trim() + "'" );
    复制代码


    结果很明显,都去除干净了,说明 trim 也是支持中文空格的。 

    源于青互联博客http://www.qing.es

  • 相关阅读:
    sqli-labs(二)
    sqli-labs(一)
    路径遍历:ZIP条目覆盖
    JWT
    ActiveMQ漏洞利用方法总结
    Tomcat任意文件上传漏洞CVE-2017-12615
    jsp的文件包含漏洞
    记一次渗透实验(四)
    unity独立游戏开发日志2018/09/22
    python网络编程的坑(持续更新)
  • 原文地址:https://www.cnblogs.com/momi/p/3780627.html
Copyright © 2011-2022 走看看