2016-09-29 2 views
1

나는 다음과 같은 정규 표현식이 있습니다URL sanitize의 정규식에 백 슬래시를 포함 하시겠습니까?

:

http://example.com?param=test1est2est3est4

하지만, 나는 다음과 같은 출력을 기대 해요 : 나는 다음과 같은 출력을 얻을

$url = "http://example.com?param=test1\test2\test3\test4"; 

$cleanUrl = preg_replace('|[^a-z0-9-~+_.?\[\]\^#=!&;,/:%@$\|*`\'<>"()\\x80-\\xff\{\}]|i', '', $url); 

http://example.com?param=test1 \ TEST2 \ TEST3 \ TEST4

나는이 정규식을 시도했지만 작동하지 않는 : 당신이 다른 방법으로 달성 할 수 무엇을하고 있는지, 아마

$cleanUrl = preg_replace('|[^a-z0-9-~+_.?\[\]\^\\#=!&;,/:%@$\|*`\'<>"()\\x80-\\xff\{\}]|i', '', $url); 
                ^escaped single quote 
+0

입력 문자열이 확실합니까? https://ideone.com/OnepGA를 참조하십시오. 나는 그것이 $ url = "http://example.com?param=test1\\test2\\test3\\test4"이어야한다고 생각한다. 그런 다음 $ cleanUrl = preg_replace ('| [^ - \\\\ a-z0-9 ~ + _. \ [\] \^#!! &;, : % @ $ \ | * \'\ '이 데모'(https://ideone.com/tUHtU3)를 참조하십시오. –

+0

당신은 다음을해야합니다 : , , , 백 슬래시를 이스케이프하려면 \\\\를 사용하십시오. [SO Answer] (http://stackoverflow.com/a/4025505/5447994) – Thamilan

답변

1

,하지만 귀하의 질문에 대답 I 입력 문자열에 백 슬래시가 포함되어 있지 않으며, 문자가 큰 따옴표로 묶인 문자열 리터럴로 포함되어 있으므로 \t은 이스케이프 시퀀스를 정의합니다.

작은 따옴표로 묶인 리터럴을 사용하면 \t은 2 개의 기호를 나타냅니다. 이제 정규식에는 \이 없습니다. 당신은 \\\\에 추가해야합니다

$url = 'http://example.com?param=test1\test2\test3\test4'; 
$cleanUrl = preg_replace('|[^-\\\\a-z0-9~+_.?\[\]^#=!&;,/:%@$\|*`\'<>"()\x80-\xff{}]|i', '', $url); 
echo $cleanUrl; 

this PHP demo 인쇄 http://example.com?param=test1\test2\test3\test4를 참조하십시오.

또한 처음으로 -을 옮겼습니다. 리터럴 하이픈과 일치해야하는 경우 문자 클래스의 시작 또는 끝에 넣는 것이 가장 좋으며, ^은 처음 위치에 있지 않습니다. char 클래스는 이스케이프 할 필요가 없습니다. {, }[도 동일하지만 대괄호가 더 잘 이스케이프됩니다 (일부 정규식은 문자 클래스에서 이스케이프 처리되지 않음 [).

관련 문제