我想我需要删除0-31和127字符。
是否有可以高效完成此操作的函数或代码片段?
chr(128)
(\x80
)是8位ASCII码中的欧元符号,许多UTF-8字体在Windows上显示欧元符号,在我的测试中也是如此。$string = preg_replace('/[\x00-\x1F\x7F]/', '', $string);
它能够在ASCII和UTF-8下工作,因为两者都使用了相同的控制字符集范围。
不使用正则表达式的最快较慢¹替代方案:
$string = str_replace(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)
), '', $string);
\t
,\n
和\r
,则请从此列表中删除chr(9)
,chr(10)
和chr(13)
。注意:通常的空格是chr(32)
,因此它会保留在结果中。请自行决定是否要删除不间断空格chr(160)
,因为它可能会引起问题。¹由@PaulDixon测试并由我验证。在 PHP 7.4 中,使用正则表达式选择答案时,Unicode 编码为 0x1d 的字符会失败。
解决方案:
<?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;
return preg_replace("/[^a-zA-Z0-9`_.,;@#%~'\"\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-\s\\\\]+/", "", $data);
如果您仍在寻找如何不删除不可打印字符而是转义它们来执行此操作的方法,我制作了这个工具以帮助您。欢迎改进!字符被转义为 \\x[A-F0-9][A-F0-9]。
使用以下方式进行调用:
$escaped = EscapeNonASCII($string);
$unescaped = UnescapeNonASCII($string);
<?php
function EscapeNonASCII($string) //Convert string to hex, replace non-printable chars with escaped hex
{
$hexbytes = strtoupper(bin2hex($string));
$i = 0;
while ($i < strlen($hexbytes))
{
$hexpair = substr($hexbytes, $i, 2);
$decimal = hexdec($hexpair);
if ($decimal < 32 || $decimal > 126)
{
$top = substr($hexbytes, 0, $i);
$escaped = EscapeHex($hexpair);
$bottom = substr($hexbytes, $i + 2);
$hexbytes = $top . $escaped . $bottom;
$i += 8;
}
$i += 2;
}
$string = hex2bin($hexbytes);
return $string;
}
function EscapeHex($string) //Helper function for EscapeNonASCII()
{
$x = "5C5C78"; //\x
$topnibble = bin2hex($string[0]); //Convert top nibble to hex
$bottomnibble = bin2hex($string[1]); //Convert bottom nibble to hex
$escaped = $x . $topnibble . $bottomnibble; //Concatenate escape sequence "\x" with top and bottom nibble
return $escaped;
}
function UnescapeNonASCII($string) //Convert string to hex, replace escaped hex with actual hex.
{
$stringtohex = bin2hex($string);
$stringtohex = preg_replace_callback('/5c5c78([a-fA-F0-9]{4})/', function ($m) {
return hex2bin($m[1]);
}, $stringtohex);
return hex2bin(strtoupper($stringtohex));
}
?>
标记的答案是完美的,但它遗漏了字符127(DEL),这也是一个不可打印的字符。
我的答案是:
$string = preg_replace('/[\x00-\x1F\x7f-\xFF]/', '', $string);
"cedivad" 为我解决了一个问题,使得瑞典字符 ÅÄÖ 的结果持久化。
"$text = preg_replace( '/[^\p{L}\s]/u', '', $text );
谢谢!
$pattern = "[[:cntrl:]".PHP_EOL."]";
mb_ereg_replace($pattern, '', $text);
我使用https://github.com/neitanod/forceutf8解决了UTF8的问题。
use ForceUTF8\Encoding;
$string = Encoding::fixUTF8($string);