1

谁能解释一下这个正则表达式的用法?

我想截断 Ascii 代码小于 32 的字符,除了

水平制表符、换行和回车。

下面的代码会相应地工作吗?或者我需要改变它吗?

JavaScript 代码:

var text = text.replace(/[\x00-\x09\x0A\x0D-\x2F]+/, "");

PHP 代码

$val = preg_replace('/[\x00-\x09\x0A\x0D-\x2F]/', '',$val);

编辑

我想保留 LF、HT 和 CR,并且不想从 String 中截断它们(如果有的话)。Ascii 32 以下的其他字符应被截断。

4

2 回答 2

1

好吧,给定:

  • 0x09 = 制表符
  • 0x12 = 换行
  • 0x15 = 回车

那么除了上面的(和仍然<32)之外的任何东西都会看起来像:

/[\x00-\x08\x10\x11\x13\x14\x16-\x1F]/

而且我假设您的意思是排他匹配(最多但不包括 32 个),否则最后一个十六进制代码应该是\x20.


$orig   = "This is a sample document. It contains:\r\n"
        . "\t* horizontal tabs,\r\n"
        . "\t* line feeds, and\r\n"
        . "\t* carriage returns\r\n"
        . "\r\n"
        . "These characters are not to be removed. However, other characters, such as:\r\n"
        . "\r\n"
        . "\t'\x06' (ACK),\r\n"
        . "\t'\x07' (BEL),\r\n"
        . "\t'\x1B' (ESC)\r\n"
        . "\t(others)\r\n"
        . "\r\n"
        . "And other characters < ordinal 32 should be removed.";

$modif  = preg_replace('/[\x00-\x08\x10\x11\x13\x14\x16-\x1F]/', '', $orig);

echo str_repeat('=', 50) . PHP_EOL;
echo (strlen($orig) == strlen($modif) ? "Failed" : "Success") . PHP_EOL;
echo str_repeat('=', 50) . PHP_EOL;
echo PHP_EOL;
echo $modif;

基于$modif短于$orig(3 个字符 [ \x06, \x07, \x1B]),但保留了空白字符([ \x09, \x12, \x15]),我想说这就是您所追求的。

于 2013-08-29T13:33:46.510 回答
1

你的第一个问题(正则表达式的解释)

由于您的十六进制代码对应于符号(十进制小于 128) - 您可以使用ASCII来检查将传递的内容。您的正则表达式正在替换这些符号:

0 000 00 00000000 NUL � 空字符
1 001 01 00000001 SOH 标题开始
2 002 02 00000010 STX 文本开头
3 003 03 00000011 ETX 文本结束
4 004 04 00000100 EOT 传输结束
5 005 05 00000101 ENQ查询
6 006 06 00000110 ACK 确认
7 007 07 00000111 贝尔贝尔
8 010 08 00001000 BS 退格
9 011 09 00001001 HT 水平制表符
10 012 0A 00001010 LF 换行

还有这些:

13 015 0D 00001101 CR 回车
14 016 0E 00001110 SO 移出/X-On
15 017 0F 00001111 SI 移入 / X-Off
16 020 10 00010000 DLE 数据线转义
17 021 11 00010001 DC1 设备控制 1(常 XON)
18 022 12 00010010 DC2 设备控制 2
19 023 13 00010011 DC3 设备控制 3(通常为 XOFF)
20 024 14 00010100 DC4 设备控制 4
21 025 15 00010101 NAK 否定确认
22 026 16 00010110 SYN 同步空闲
23 027 17 00010111 ETB 传输块结束
24 030 18 00011000 可以取消
25 031 19 00011001 EM 介质结束
26 032 1A 00011010 SUB 替代
27 033 1B 00011011 电调逃逸
28 034 1C 00011100 FS 文件分隔符
29 035 1D 00011101 GS 组分隔符
30 036 1E 00011110 RS 记录分隔符
31 037 1F 00011111 美国单位分隔符
32 040 20 00100000 空间
33 041 21 00100001!!感叹号
34 042 22 00100010 " " " 双引号(或语音标记)
35 043 23 00100011 # # 号码
36 044 24 00100100 $ $ 美元
37 045 25 00100101 % % Procenttecken
38 046 26 00100110 & & & & 和号
39 047 27 00100111 ' ' 单引号
40 050 28 00101000 ( ( 开括号(或开括号)
41 051 29 00101001 ) ) 右括号(或右括号)
42 052 2A 00101010 * * 星号
43 053 2B 00101011 + + 加
44 054 2C 00101100 , , 逗号
45 055 2D 00101101 - - 连字符
46 056 2E 00101110。. 句点、点或句号
47 057 2F 00101111 //斜线或除法

为空字符串。

你的第二个问题(替换非打印,即0-31,即0x00-0x19

如果您想截断 32 位以下的所有符号(似乎不可打印),那么:

$val = preg_replace('/[\x00-\x09\x12\x14-\x19]/', '',$val); //x12 also should be restricted

(更新,保留HT,,,LFCR

于 2013-08-29T13:34:10.113 回答