我正在开发一个PHP应用程序,它必须解析由另一个程序发送的字符串。问题是一些字符串有八进制字符和中间的其他一些转义。
因此,而不是script>XYZ
,我得到了:
\103RI\120T>XYZ%6En \151\156 d%6Fcu\155%65n..
我需要打印这个解码后的字符串...我尝试使用octdec
,url_decode
等,但是一个只能使用一个字符串而另一个不能解码八进制...有人有建议吗?
答案 0 :(得分:1)
试试这个:
$str = '\103RI\120T>XYZ%6En \151\156 d%6Fcu\155%65n..';
// CRIPT>XYZnn in documen..
echo preg_replace(array('~\\\(\d+)~e', '~%([0-9A-F]{2})~e'), array('chr(octdec("$1"))', 'chr(hexdec("$1"))'), $str);
关于%AD
部分,我不确定代表什么意思,你能解释一下吗?
答案 1 :(得分:1)
urldecode(stripcslashes("\103RI\120T>XYZ%6En \151\156 d%6Fcu\155%65n.."));
答案 2 :(得分:1)
使用preg_replace_callback()。使用与八进制数和转义匹配的模式(确保匹配\
和%
字符。基于第一个字符,回调应该能够理解是否转换八进制数,或转换转义序列。
回调可以使用base_convert()(第一种情况下为base_convert($match, 8, 10)
;第二种情况下为base_convert($match, 16, 10)
)来转换八进制数或十六进制数。
答案 3 :(得分:0)
$octstr = '\103RI\120T>XYZ%6En \151\156 d%6Fcu\155%65n';
preg_match_all('/\\\[0-9]{3}/',$octstr,$matches);
$oct = $matches[0];
foreach($oct as $o){
$octstr = str_replace($o,chr(octdec($o)),$octstr);
}
echo urldecode($octstr);
输出:
CRIPT>XYZnn in documen