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

경고 : 제목에 깨진 영어가 포함되어 있습니다. :) 수정하십시오. –

답변

2

문자의 모든 어커런스를 0에서 31 사이의 숫자 (대개 제어 문자 및 실제 공백 문자를 제외한 간격)와 숫자 값으로 바꿉니다. regex의 끝에있는 e는 '마치 PHP 코드 인 것처럼 패턴을 평가'한다는 것을 의미하며 preg_replace 내부에서 문자열 연결과 sprintf 사용을 허용합니다. regex는 더 일반적인/대신에 #로 구분됩니다.이 경우 아무 이유없이 (정규 표현식 문자열에 /가 포함되어 있으면 이스케이프를 피할 수 있습니다.) 예를 들어

:

<?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

업데이트 :

내가 가까이 그것을보고하고 그것이 \x 접두어로 자신의 헥사 값에 1-31 범위의 모든 아스키 문자로 변환처럼 보이는. 내가 결정했습니다

내 원래 장내 반응 추측은 잘못된 것입니다 : 그것은에는 urlencoding처럼

보인다. 아마도 php urlencode 함수 대신에 내장 함수를 사용할 것입니다.

+1

0에서 31, 1이 아닙니다. –