如何删除字符串中所有不可打印的字符?

2024-04-29

我想我需要删除字符 0-31 和 127。

是否有一个函数或一段代码可以有效地完成此操作?


7 位 ASCII?

如果您的 Tardis 于 1963 年刚刚上市,并且您只想要 7 位可打印 ASCII 字符,则可以使用以下命令删除 0-31 和 127-255 之间的所有内容:

$string = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $string);

它匹配 0-31、127-255 范围内的任何内容并将其删除。

8 位扩展 ASCII?

你掉进了热水浴缸时间机器,然后你又回到了八十年代。 如果您有某种形式的 8 位 ASCII,那么您可能希望将字符保持在 128-255 范围内。调整简单 - 只需查找 0-31 和 127

$string = preg_replace('/[\x00-\x1F\x7F]/', '', $string);

UTF-8?

啊,欢迎回到21世纪。如果您有 UTF-8 编码的字符串,那么/u modifier http://php.net/manual/en/reference.pcre.pattern.modifiers.php可以在正则表达式上使用

$string = preg_replace('/[\x00-\x1F\x7F]/u', '', $string);

这只是删除了 0-31 和 127。这适用于 ASCII 和 UTF-8,因为两者共享相同的控制设定范围 http://www.fileformat.info/info/charset/UTF-8/list.htm(正如下面 mgutt 所指出的)。严格来说,这无需/u修饰符。但如果你想删除其他字符,它会让生活变得更容易......

如果您正在处理 Unicode,那么有潜在的许多非打印元素 https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters,但让我们考虑一个简单的:不间断空格 (U+00A0) https://unicode-table.com/en/00A0/

在 UTF-8 字符串中,这将被编码为0xC2A0。您可以查找并删除该特定序列,但使用/u修饰符到位,您可以简单地添加\xA0到字符类:

$string = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $string);

附录:str_replace 怎么样?

preg_replace 非常高效,但是如果您经常执行此操作,您可以构建一个要删除的字符数组,并使用 str_replace,如下 mgutt 所示,例如

//build an array we can re-use across several operations
$badchar=array(
    // control characters
    chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10),
    chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20),
    chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30),
    chr(31),
    // non-printing characters
    chr(127)
);

//replace the unwanted chars
$str2 = str_replace($badchar, '', $str);

直观上,这似乎会很快,但情况并非总是如此,您绝对应该进行基准测试,看看它是否可以为您节省任何东西。我使用随机数据对各种字符串长度进行了一些基准测试,并且使用 php 7.0.12 出现了这种模式

     2 chars str_replace     5.3439ms preg_replace     2.9919ms preg_replace is 44.01% faster
     4 chars str_replace     6.0701ms preg_replace     1.4119ms preg_replace is 76.74% faster
     8 chars str_replace     5.8119ms preg_replace     2.0721ms preg_replace is 64.35% faster
    16 chars str_replace     6.0401ms preg_replace     2.1980ms preg_replace is 63.61% faster
    32 chars str_replace     6.0320ms preg_replace     2.6770ms preg_replace is 55.62% faster
    64 chars str_replace     7.4198ms preg_replace     4.4160ms preg_replace is 40.48% faster
   128 chars str_replace    12.7239ms preg_replace     7.5412ms preg_replace is 40.73% faster
   256 chars str_replace    19.8820ms preg_replace    17.1330ms preg_replace is 13.83% faster
   512 chars str_replace    34.3399ms preg_replace    34.0221ms preg_replace is  0.93% faster
  1024 chars str_replace    57.1141ms preg_replace    67.0300ms str_replace  is 14.79% faster
  2048 chars str_replace    94.7111ms preg_replace   123.3189ms str_replace  is 23.20% faster
  4096 chars str_replace   227.7029ms preg_replace   258.3771ms str_replace  is 11.87% faster
  8192 chars str_replace   506.3410ms preg_replace   555.6269ms str_replace  is  8.87% faster
 16384 chars str_replace  1116.8811ms preg_replace  1098.0589ms preg_replace is  1.69% faster
 32768 chars str_replace  2299.3128ms preg_replace  2222.8632ms preg_replace is  3.32% faster

时间本身是针对 10000 次迭代的,但更有趣的是相对差异。最多 512 个字符,我发现 preg_replace 总是获胜。在 1-8kb 范围内,str_replace 有一定的优势。

我认为这是一个有趣的结果,所以将其放在这里。重要的不是获取这个结果并用它来决定使用哪种方法,而是根据自己的数据进行基准测试,然后做出决定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何删除字符串中所有不可打印的字符? 的相关文章

随机推荐

  • 如何使用 FLUTTER go_router 弹出上下文?

    如何使用 flutter go router 返回上一个屏幕 如何弹出上下文 目前 我只是将一个新屏幕添加到堆栈中 无论我想返回还是前进 onTap gt context go secondPage 我用过 context pop 但它会抛
  • 在 Symfony2 中使用 json 数据水合实体

    有没有办法用 Symfony2 中传入请求的 json 数据来水合实体 我以为有类似的东西 Form bindRequest 但我找不到任何东西 如果能将这个功能与 knockout js 等库一起使用 那就太好了 如果您需要从 JSON
  • 从对话框调用 CustomAction 时出现 WiX 安装错误 2762

    我是初学者 开始学习WiX 我想在安装过程中捕获 验证和注册用户详细信息 我创建了一个对话框来捕获用户注册并在用户单击 下一步 后调用自定义操作 但在这里我收到安装程序错误 2762 虽然错误描述说 必须在 InstallInitializ
  • 通过 HTTP 更新自托管扩展

    我正在将基于 SDK 的 Firefox 扩展转换为 WebExtensions 并且遇到了更新扩展的问题 当前的扩展托管在我自己的域 这是一个 HTTP 域 上 以及更新 rdf file 现在 对于基于 SDK 的附加组件 只要使用以下
  • 未捕获的错误:地图容器已初始化

    我正在使用 React JS 制作网页 我的目标是在前端显示地图 我正在使用react leaflet npm 包来实现同样的目的 但是 我收到以下错误 Error Uncaught Error Map container is alrea
  • 如何防止通过“new”运算符分配类? (我想确保我的 RAII 类始终分配在堆栈上。)

    我想确保我的 RAII 类始终分配在堆栈上 如何防止通过 new 运算符分配类 您需要做的就是将类的 new 运算符声明为私有 class X private Prevent heap allocation void operator ne
  • 访问二维数组的一行末尾之后的元素是否是 UB?

    以下程序的行为是否未定义 include
  • Docker:内存文件系统

    我有一个 docker 容器 它对磁盘进行大量读 写操作 我想测试当我的整个 docker 文件系统都在内存中时会发生什么 我在这里看到一些答案说这不会是真正的性能改进 但这是为了测试 我想测试的理想解决方案是共享每个图像的公共部分 并在需
  • 是否可以将向量的一部分作为向量发送给函数? [复制]

    这个问题在这里已经有答案了 我想看看是否可以将向量的一部分传递给函数 以便它显示为函数的法线向量 更重要的是 我希望这可以在 O 1 的常数时间内完成 我不想迭代向量来创建一个新向量 事实上 我还希望在下面的示例中将新向量的大小更改为 40
  • 如何覆盖 Symfony2 包中的实体

    我在用着FOS用户包 for Symfony2 我需要能够注册一个用户不验证电子邮件是否唯一 我只需要一个有效的电子邮件 所以许多用户可以拥有相同的电子邮件 我知道这很奇怪 但我需要它 我在捆绑包中有一个实体 用户 扩展 FOSUserBu
  • 使用 JSeperator - Java 时出现异常间隙

    我一直在开发 Swing GUI 并在添加后出现一些不寻常和不需要的间隙JSeperator 知道如何删除它们吗 或者任何其他选择来很好地实现这一目标 视觉描述 之前差距就很明显了JLabel 速度 及之后JSlider 相关代码 cont
  • android:如何将图像添加到相册

    任何人都可以分享代码 或向我指出 Android 示例代码 来帮助我将图像添加到媒体商店 图库 中的相册中 在我的应用程序中 我从服务器下载图像 并使用相机 通过 Intent 拍摄新图像 我想将这些图像组织在特定于应用程序的相册中 类似于
  • PHP - 使用大量参数和默认值初始化对象的最佳方法

    我正在设计一个类 它定义一个高度复杂的对象 其中包含大量 50 大部分可选参数 其中许多参数都有默认值 例如 type foo width 300 interactive false 我试图确定设置构造函数和实例 类变量的最佳方法 以便能够
  • Codeigniter - 仅当数据库中不存在电子邮件时才更新电子邮件

    我为我的用户提供了一个更新页面 他们可以在其中编辑他们的姓名 电子邮件和其他信息 到目前为止 他们可以编辑一切 包括他们的电子邮件 他们可以毫无问题地输入数据库中已存在的电子邮件 我尝试添加此表单验证规则 this gt form vali
  • 使用 Node.js 从 URL 读取内容

    我正在尝试使用 Node js 从 URL 读取内容 但我似乎得到的只是一堆字节 我显然做错了什么 但我不确定是什么 这是我目前拥有的代码 var http require http var client http createClient
  • 如何在powershell中使用SVN提交

    我想在我的 PowerShell 脚本中使用 SVN 命令 我知道我需要将 SVN 可执行文件声明为变量 但之后我想提交一个已声明为变量的文件 并且我想要给出的提交消息在文件中指定 svnExe C Program Files Tortoi
  • 在 Android 中下载文件

    我正在使用以下代码在 Android 中下载文件 public class FileDownloadActivity extends Activity ProgressDialog mProgressDialog Called when t
  • 将正在运行的计数显示计时器添加到 iOS 应用程序中,例如时钟秒表?

    我正在使用一个应用程序 该应用程序可以处理设备运动事件并以 5 秒的增量更新界面 我想向应用程序添加一个指示器 以显示应用程序运行的总时间 看起来像秒表的计数器 例如本机 iOS 时钟应用程序 是计算应用程序运行时间并将其显示给用户的合理方
  • 如何在 javascript 中使用 .net 资源文件

    无论如何 我可以在 javascript 中访问我的资源文件 resx 吗 如果没有 那么是否有任何解决方法可以用不同语言的 javascript 显示消息 如果您的 javascript 在页面中 您可以使用 var globalReso
  • 如何删除字符串中所有不可打印的字符?

    我想我需要删除字符 0 31 和 127 是否有一个函数或一段代码可以有效地完成此操作 7 位 ASCII 如果您的 Tardis 于 1963 年刚刚上市 并且您只想要 7 位可打印 ASCII 字符 则可以使用以下命令删除 0 31 和