Pau*_*xon 327
如果你只是TARDIS在1963年登陆,只是想和你的7位可打印的ASCII字符,你可以从0-31和127-255这个撕裂了一切:
$string = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $string);
Run Code Online (Sandbox Code Playgroud)
它匹配范围0-31,127-255中的任何内容并将其删除.
你掉进了热水浴缸时间机器,你回到了八十年代.如果您有某种形式的8位ASCII,那么您可能希望将字符保持在128-255范围内.一个简单的调整 - 只需要0-31和127
$string = preg_replace('/[\x00-\x1F\x7F]/', '', $string);
Run Code Online (Sandbox Code Playgroud)
啊,欢迎回到21世纪.如果您有UTF-8编码的字符串,则可以在正则表达式上使用/u
修饰符
$string = preg_replace('/[\x00-\x1F\x7F]/u', '', $string);
Run Code Online (Sandbox Code Playgroud)
这只是删除0-31和127.这适用于ASCII和UTF-8,因为它们共享相同的控制集范围(如下面的mgutt所述).严格来说,这可以在没有/u
修饰符的情况下工作.但如果你想删除其他字符,它会让生活变得更轻松......
如果您正在处理Unicode,可能会有很多非打印元素,但让我们考虑一个简单的元素:NO-BREAK SPACE(U + 00A0)
在UTF-8字符串中,这将被编码为0xC2A0
.您可以查找并删除该特定序列,但是使用/u
修饰符,您只需添加\xA0
到字符类:
$string = preg_replace('/[\x00-\x1F\x7F\xA0]/u', '', $string);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
直观地说,这似乎很快,但情况并非总是如此,你应该确定基准,看它是否能为你节省一些东西.我使用随机数据在各种字符串长度上做了一些基准测试,这个模式使用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
Run Code Online (Sandbox Code Playgroud)
时间本身是10000次迭代,但更有趣的是相对差异.最多512个字符,我看到preg_replace总是赢.在1-8kb范围内,str_replace具有边缘优势.
我认为这是有趣的结果,所以包括在这里.重要的是不要采用这个结果并使用它来决定使用哪种方法,而是根据自己的数据进行基准测试然后再决定.
Dal*_*lin 137
这里的许多其他答案都没有考虑到unicode字符(例如öäüßйȝîûηыыეமிᚉ⠛).在这种情况下,您可以使用以下内容:
$string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]/u', '', $string);
Run Code Online (Sandbox Code Playgroud)
范围内有一类奇怪的字符\x80-\x9F
(正好在7位ASCII字符范围之上)是技术上控制字符,但随着时间的推移被滥用于可打印字符.如果您对这些没有任何问题,那么您可以使用:
$string = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $string);
Run Code Online (Sandbox Code Playgroud)
如果您还希望剥离换行符,回车符,制表符,不间断空格和软连字符,则可以使用:
$string = preg_replace('/[\x00-\x1F\x7F-\xA0\xAD]/u', '', $string);
Run Code Online (Sandbox Code Playgroud)
请注意,您必须对上述示例使用单引号.
如果您想剥离除基本可打印ASCII字符以外的所有内容(上面的所有示例字符都将被剥离),您可以使用:
$string = preg_replace( '/[^[:print:]]/', '',$string);
Run Code Online (Sandbox Code Playgroud)
有关参考,请参阅http://www.fileformat.info/info/charset/UTF-8/list.htm
gho*_*g74 26
你可以使用字符类
/[[:cntrl:]]+/
Run Code Online (Sandbox Code Playgroud)
Kev*_*son 25
从PHP 5.2开始,我们也可以访问filter_var,我没有看到任何提及,所以我想把它扔出去.要使用filter_var去除不可打印的字符<32和> 127,您可以执行以下操作:
过滤32位以下的ASCII字符
$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW);
Run Code Online (Sandbox Code Playgroud)
过滤127以上的ASCII字符
$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_HIGH);
Run Code Online (Sandbox Code Playgroud)
剥离两个:
$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
Run Code Online (Sandbox Code Playgroud)
您还可以在删除高位时对低字符(换行符,制表符等)进行html编码:
$string = filter_var($input, FILTER_UNSAFE_RAW, FILTER_FLAG_ENCODE_LOW|FILTER_FLAG_STRIP_HIGH);
Run Code Online (Sandbox Code Playgroud)
还有剥离HTML,清理电子邮件和URL等的选项.因此,有很多选项可用于清理(去除数据)甚至验证(如果无效则返回false而不是静默剥离).
消毒: http ://php.net/manual/en/filter.filters.sanitize.php
验证: http ://php.net/manual/en/filter.filters.validate.php
但是,仍然存在问题,FILTER_FLAG_STRIP_LOW将删除换行符和回车符,对于textarea来说这是完全有效的字符...所以我猜,有些正则表达式的答案有时仍然是必要的,例如在查看之后线程,我打算为textareas做这个:
$string = preg_replace( '/[^[:print:]\r\n]/', '',$input);
Run Code Online (Sandbox Code Playgroud)
这似乎比数字范围剥离的一些正则表达式更具可读性.
jac*_*ade 18
这更简单:
$ string = preg_replace('/ [^ [:cntrl:]] /','',$ string);
Way*_*bel 16
所有解决方案都有部分工作,甚至可能未涵盖所有情况.我的问题是尝试将字符串插入到utf8 mysql表中.字符串(及其字节)都符合utf8,但有几个错误的序列.我假设他们中的大多数是控制或格式化.
function clean_string($string) {
$s = trim($string);
$s = iconv("UTF-8", "UTF-8//IGNORE", $s); // drop all non utf-8 characters
// this is some bad utf-8 byte sequence that makes mysql complain - control and formatting i think
$s = preg_replace('/(?>[\x00-\x1F]|\xC2[\x80-\x9F]|\xE2[\x80-\x8F]{2}|\xE2\x80[\xA4-\xA8]|\xE2\x81[\x9F-\xAF])/', ' ', $s);
$s = preg_replace('/\s+/', ' ', $s); // reduce all multiple whitespace to a single space
return $s;
}
Run Code Online (Sandbox Code Playgroud)
进一步加剧问题的是表格与服务器对比连接与内容的呈现,正如这里所说的那样
我的UTF-8兼容版本:
preg_replace('/[^\p{L}\s]/u','',$value);
从输入字符串中去除所有非 ASCII 字符
$result = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);
该代码删除了十六进制范围 0-31 和 128-255 中的所有字符,只留下了结果字符串中的十六进制字符 32-127,在本例中我将其称为 $result。
您可以使用常规快递删除除了您希望保留的字符之外的所有内容:
$string=preg_replace('/[^A-Za-z0-9 _\-\+\&]/','',$string);
Run Code Online (Sandbox Code Playgroud)
替换所有不是(^)字母AZ或az,数字0-9,空格,下划线,hypen,plus和&符号 - 什么都没有(即删除它).
preg_replace('/(?!\n)[\p{Cc}]/', '', $response);
Run Code Online (Sandbox Code Playgroud)
这将删除所有的控制字符(http://uk.php.net/manual/en/regexp.reference.unicode.php离开)\n
换行符.根据我的经验,控制字符是最常引起打印问题的字符.
@PaulDixon的答案 是完全错误的,因为它删除了可打印的 扩展ASCII字符128-255!已部分修正。我不知道为什么他仍然想从 127 个字符的 7 位 ASCII 集中删除 128-255,因为它没有扩展 ASCII 字符。
但最后重要的是不要删除 128-255,因为例如chr(128)
( \\x80
) 是 8 位 ASCII 中的欧元符号,并且 Windows 中的许多 UTF-8 字体显示欧元符号,而根据我自己的测试,Android 中显示欧元符号。
如果从 UTF-8 字符串中删除 ASCII 字符 128-255(可能是多字节 UTF-8 字符的起始字节),它将杀死许多 UTF-8 字符。所以不要这样做!它们在当前使用的所有文件系统中都是完全合法的字符。唯一保留的范围是 0-31。
\n\n相反,使用它来删除不可打印的字符 0-31 和 127:
\n\n$string = preg_replace(\'/[\\x00-\\x1F\\x7F]/\', \'\', $string);\n
Run Code Online (Sandbox Code Playgroud)\n\n它适用于 ASCII 和 UTF-8,因为两者共享相同的控制集范围。
\n\n不使用正则表达式的最快较慢\xc2\xb9 替代方案:
$string = str_replace(array(\n // control characters\n chr(0), chr(1), chr(2), chr(3), chr(4), chr(5), chr(6), chr(7), chr(8), chr(9), chr(10),\n chr(11), chr(12), chr(13), chr(14), chr(15), chr(16), chr(17), chr(18), chr(19), chr(20),\n chr(21), chr(22), chr(23), chr(24), chr(25), chr(26), chr(27), chr(28), chr(29), chr(30),\n chr(31),\n // non-printing characters\n chr(127)\n), \'\', $string);\n
Run Code Online (Sandbox Code Playgroud)\n\n如果您想保留所有空白字符\\t
,\\n
和,则从该列表中\\r
删除chr(9)
,chr(10)
和。chr(13)
注意:通常的空白是chr(32)
因此它保留在结果中。您自己决定是否要删除不间断空格,chr(160)
因为它可能会导致问题。
\xc2\xb9 由@PaulDixon 测试并由我自己验证。
\n 归档时间: |
|
查看次数: |
203298 次 |
最近记录: |