我想我需要删除字符 0-31 和 127。
是否有一个函数或一段代码可以有效地做到这一点?
原文由 Stewart Robinson 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想我需要删除字符 0-31 和 127。
是否有一个函数或一段代码可以有效地做到这一点?
原文由 Stewart Robinson 发布,翻译遵循 CC BY-SA 4.0 许可协议
Unicode 选择答案的正则表达式失败:0x1d(使用 php 7.4)
一个解法:
<?php
$ct = 'différents'."\r\n test";
// fail for Unicode: 0x1d
$ct = preg_replace('/[\x00-\x1F\x7F]$/u', '',$ct);
// work for Unicode: 0x1d
$ct = preg_replace( '/[^\P{C}]+/u', "", $ct);
// work for Unicode: 0x1d and allow line break
$ct = preg_replace( '/[^\P{C}\n]+/u', "", $ct);
echo $ct;
from: UTF 8 String 删除除换行符以外的所有不可见字符
原文由 Mkdgs 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答7k 阅读✓ 已解决
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答624 阅读✓ 已解决
7位ASCII?
如果您的 Tardis 刚刚在 1963 年登陆,并且您只想要 7 位可打印 ASCII 字符,您可以使用以下命令删除 0-31 和 127-255 中的所有内容:
它匹配 0-31、127-255 范围内的任何内容并将其删除。
8位扩展ASCII?
你掉进了热水浴缸时光机,你又回到了八十年代。如果您有某种形式的 8 位 ASCII,那么您可能希望将字符保持在 128-255 范围内。一个简单的调整 - 只需寻找 0-31 和 127
UTF-8?
啊,欢迎回到21世纪。如果你有一个 UTF-8 编码的字符串,那么
/u
修饰符 可以用于正则表达式这只是删除了 0-31 和 127。这适用于 ASCII 和 UTF-8,因为它们共享 相同的控制集范围(如下面的 mgutt 所述)。严格来说,如果没有
/u
修饰符,这将起作用。但如果你想删除其他字符,它会让生活更轻松……如果您正在处理 Unicode,则 可能有许多非打印元素,但让我们考虑一个简单的元素: NO-BREAK SPACE (U+00A0)
在 UTF-8 字符串中,这将被编码为
0xC2A0
。您可以查找并删除该特定序列,但是使用/u
修饰符,您可以简单地将\xA0
添加到字符类:附录:str_replace 呢?
preg_replace 非常有效,但是如果您经常执行此操作,则可以构建一个要删除的字符数组,并使用 str_replace,如下面的 mgutt 所述,例如
直观地说,这似乎会很快,但并非总是如此,您绝对应该进行基准测试,看看它是否能为您节省任何东西。我使用随机数据对各种字符串长度进行了一些基准测试,这种模式使用 php 7.0.12 出现
时间本身是 10000 次迭代,但更有趣的是相对差异。最多 512 个字符,我看到 preg_replace 总是赢。在 1-8kb 范围内,str_replace 有一个边缘。
我认为这是一个有趣的结果,所以在这里包括它。 重要的是不要拿这个结果并用它来决定使用哪种方法,而是对自己的数据进行基准测试,然后再决定。