删除字符串中的非ascii字符

 兔帽儿 发布于 2023-02-07 13:01

ASCII的范围是0到127,所以:

str.replace(/[^\x00-\x7F]/g, "");

@AlexanderMills搜索ascii表 - 您可以看到只有值为0到127的字符才有效.(0x7F为十六进制127).此代码匹配不在ascii范围内的所有字符并删除它们. (6认同)

更优雅! (2认同)


IAM_AL_X.. 18

它也可以通过正面的删除声明来完成,如下所示:

textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");

这使用unicode.在Javascript中,当表达正则表达式的unicode时,字符用转义序列指定,\u{xxxx}但标志'u'必须存在; 注意正则表达式有标志'gu'.

我称这是一个"正面的删除断言",意思是"正面"断言表示要删除哪些字符,而"否定"断言则表示哪些字母不能删除.在许多情况下,如先前答案中所述,否定主张可能对读者更具启发性.旋律" ^"表示"不",范围\x00-\x7F表示"ascii",所以两人一起说"不是ascii".

textContent = textContent.replace(/[^\x00-\x7F]/g,"");

对于只关心英语的英语使用者而言,这是一个很好的解决方案,对于原始问题也是一个很好的答案.但在更一般的背景下,人们不能总是接受假设"所有非ascii都不好"的文化偏见.对于使用非ascii但偶尔需要删除的上下文,Unicode的正面断言更适合.

字符串中嵌入零宽度非打印字符的一个很好的指示是当字符串的"长度"属性为正(非零)时,但看起来像(即打印为)空字符串.例如,我在Chrome调试器中显示了一个名为"textContent"的变量:

> textContent
""
> textContent.length
7

这促使我想要查看该字符串中的内容.

> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"

这个字节序列似乎是一些Unicode字符的族,它们被字处理器插入到文档中,然后进入数据字段.最常见的是,这些符号出现在文档的末尾.零宽度空间"%E2%80%8B"可能由CK-Editor(CKEditor)插入.

encodeURI()  UTF-8     Unicode  html     Meaning
-----------  --------  -------  -------  -------------------
"%E2%80%8B"  EC 80 8B  U 200B   ​  zero-width-space
"%E2%80%8E"  EC 80 8E  U 200E   ‎  left-to-right-mark
"%E2%80%8F"  EC 80 8F  U 200F   ‏  right-to-left-mark

一些参考文献:

http://www.fileformat.info/info/unicode/char/200B/index.htm

https://en.wikipedia.org/wiki/Left-to-right_mark

请注意,虽然嵌入字符的编码是UTF-8,但正则表达式中的编码不是.尽管字符在字符串中嵌入了UTF-8的三个字节(在我的例子中),但正则表达式中的指令必须使用双字节Unicode.实际上,UTF-8最长可达4个字节; 它不如Unicode那么紧凑,因为它使用高位(或位)来逃避标准的ascii编码.这在这里解释:

https://en.wikipedia.org/wiki/UTF-8

3 个回答
  • ASCII的范围是0到127,所以:

    str.replace(/[^\x00-\x7F]/g, "");
    

    2023-02-07 13:03 回答
  • 它也可以通过正面的删除声明来完成,如下所示:

    textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
    

    这使用unicode.在Javascript中,当表达正则表达式的unicode时,字符用转义序列指定,\u{xxxx}但标志'u'必须存在; 注意正则表达式有标志'gu'.

    我称这是一个"正面的删除断言",意思是"正面"断言表示要删除哪些字符,而"否定"断言则表示哪些字母不能删除.在许多情况下,如先前答案中所述,否定主张可能对读者更具启发性.旋律" ^"表示"不",范围\x00-\x7F表示"ascii",所以两人一起说"不是ascii".

    textContent = textContent.replace(/[^\x00-\x7F]/g,"");
    

    对于只关心英语的英语使用者而言,这是一个很好的解决方案,对于原始问题也是一个很好的答案.但在更一般的背景下,人们不能总是接受假设"所有非ascii都不好"的文化偏见.对于使用非ascii但偶尔需要删除的上下文,Unicode的正面断言更适合.

    字符串中嵌入零宽度非打印字符的一个很好的指示是当字符串的"长度"属性为正(非零)时,但看起来像(即打印为)空字符串.例如,我在Chrome调试器中显示了一个名为"textContent"的变量:

    > textContent
    ""
    > textContent.length
    7
    

    这促使我想要查看该字符串中的内容.

    > encodeURI(textContent)
    "%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"
    

    这个字节序列似乎是一些Unicode字符的族,它们被字处理器插入到文档中,然后进入数据字段.最常见的是,这些符号出现在文档的末尾.零宽度空间"%E2%80%8B"可能由CK-Editor(CKEditor)插入.

    encodeURI()  UTF-8     Unicode  html     Meaning
    -----------  --------  -------  -------  -------------------
    "%E2%80%8B"  EC 80 8B  U 200B   ​  zero-width-space
    "%E2%80%8E"  EC 80 8E  U 200E   ‎  left-to-right-mark
    "%E2%80%8F"  EC 80 8F  U 200F   ‏  right-to-left-mark
    

    一些参考文献:

    http://www.fileformat.info/info/unicode/char/200B/index.htm

    https://en.wikipedia.org/wiki/Left-to-right_mark

    请注意,虽然嵌入字符的编码是UTF-8,但正则表达式中的编码不是.尽管字符在字符串中嵌入了UTF-8的三个字节(在我的例子中),但正则表达式中的指令必须使用双字节Unicode.实际上,UTF-8最长可达4个字节; 它不如Unicode那么紧凑,因为它使用高位(或位)来逃避标准的ascii编码.这在这里解释:

    https://en.wikipedia.org/wiki/UTF-8

    2023-02-07 13:05 回答
  • 您可以使用以下正则表达式替换非ASCII字符

    str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')
    

    但请注意,空格,冒号和逗号都是有效的ASCII,因此结果将是

    > str
    "INFO] :, , ,  (Higashikurume)"
    

    2023-02-07 13:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有