【问题标题】:Remove control characters from string in PHP [duplicate]从PHP中的字符串中删除控制字符[重复]
【发布时间】:2017-06-20 04:23:25
【问题描述】:

我的 MySQL 数据库中有很多字符串,其中包含控制字符,例如 ^M。我想要一个在 PHP 中删除它的正则表达式,但只留下诸如换行之类的东西,例如:“\n”。

我尝试了以下方法:

preg_replace('/[\x00-\x09\x0B\x0C\x0E-\x1F\x7F]/', '', $bad);

这似乎让它留在原地。

摆脱这些控制字符的最佳方法是什么?

【问题讨论】:

  • 有这样的字符串的例子吗?
  • 您或许可以从数据库端解决这个问题:dba.stackexchange.com/questions/97518/…
  • @RomanPerekhrest 我不完全确定如何输入控制字符 ^M。在 vim 中,您可以执行 ctrl+v+m,但不能只是在此处复制/粘贴该输出。建议?
  • 当然,这个正则表达式会留下换行符(0x0A),它们不匹配。如果您想知道正则表达式应该是什么,那么您需要比“控制字符”和您使用的字符集更具体。
  • 理想情况下,我认为 12 月 0-31 日的所有内容都应该匹配,而不要理会“\r\n”。 asciitable.com

标签: php regex


【解决方案1】:

我想要一个在 PHP 中删除它的正则表达式,但不考虑诸如 新行,例如:“\n”

使用以下方法:

preg_replace("/(\x0A)|[[:cntrl:]]/", "$1", $bad);

\x0A - 指向换行符

[[:cntrl:]] - 代表所有控制字符

(\x0A)|[[:cntrl:]] - 一次匹配换行符或一些控制字符的交替组。

$1 保存第一个捕获组,该组只有在匹配时才是换行符

【讨论】:

  • @randombits,添加了一些解释
【解决方案2】:

你可以使用这个替换:

$result = preg_replace('~[^\P{Cc}\r\n]+~u', '', $str);

\p{Cc} 是控制字符的 unicode 字符类。 \P{Cc} 是相反的(所有不是控制字符)

[^\P{Cc}\r\n] 是除了 \P{Cc}\r\n 之外的所有东西。

u 修饰符确保字符串和模式被读取为 utf8 字符串。

如果要保留其他控制字符,例如 TAB,请将其添加到否定字符类:[^\P{Cc}\r\n\t]

【讨论】:

  • 无论出于何种原因,这对我都不起作用。下面@RomanPerekhrest 的回答确实如此。我试图理解为什么您的示例不适用于其中肯定包含 ^M 字符的字符串。
  • @randombits:我认为^M 代表回车(CR),如果您不想在字符串中使用回车,请将\r 从否定字符类中删除。跨度>
  • @randombits:请注意,您的目标只是将换行 Windows 字符序列更改为换行 unix/linux 字符序列 str_replace("\r\n", "\n", $str)str_replace("\r", "", $str) 就足够了。
猜你喜欢
  • 2010-12-02
  • 2014-02-12
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
相关资源
最近更新 更多