2009-09-15 74 views
0
$str = 
preg_replace('#([\x00-\x1F])#e', '"\x" . sprintf("%02x", ord("\1"))', $str); 
+0

警告:标题包含破碎的英语:)请修复。 – 2009-09-15 17:01:28

回答

2

它将数字值替换为0到31之间(主要是控制字符和间距,除了实际空格字符之外)的序数值的每个字符。正则表达式的结尾处的e意味着“像对待PHP代码一样评估模式”,并允许在preg_replace中使用字符串连接和sprintf。正则表达式由#分隔,而不是更常见的/,在这种情况下没有理由(通常在正则表达式字符串中包含/时避免它们转义)。

例如:

<?php 
$str = "\t 22 \n ducks"; 
$str = preg_replace('#([\x00-\x1F])#e', '"\x" . sprintf("%02x", ord("\1"))', $str); 
echo $str; 
?> 

输出:

\x09 22 \x0a ducks 

取出从模式e,你会得到这样的:

"\x" . sprintf("%02x", ord(" ")) 22 "\x" . sprintf("%02x", ord(" ")) ducks 

至少在这里。

1

更新:

我看着它密切,它看起来像它的将所有ASCII字符的的1-31范围内的十六进制相当于一个\x前缀。我已经决定

我最初的直觉反应的猜测是不正确的:

看起来像它的URL编码。我可能会使用内置的php urlencode函数。

+1

从0到31,而不是1。 – 2009-09-15 17:02:14