2011-07-29 5 views
1

정규 표현식 문자를 취소합니다 탈출 :내가 그들을 대체하여 문자열에서 특정 문자를 제거하고 있습니다

% -> %% 
: -> %c 
/-> %s 

문자열 "% c를"제대로 %%의 C로 탈출한다. 그러나 str_replace (배열 ('%%', '% c', '% s'), 배열 ('%', ':', '/'), $ s) ":"에 입력하십시오. 그것은 문서마다 str_replace의 적절한 동작입니다. 그래서 정규 표현식을 사용하여 해결책을 모색하고 있습니다.

이스케이프 처리 된 문자열을 올바르게 해독하려면 어떻게해야합니까? 고맙습니다. 당신은 연속적으로 한 번이 아니라 모든 이스케이프 시퀀스를 대체 할 필요가

<?php 

$escaped = "Hello %% World%c You'll find your reservation under %s"; 

echo preg_replace("/%TMP/", "%", 
     preg_replace("/%s/", "/", 
      preg_replace("/%c/", ":", 
       preg_replace("/%%/", "%TMP", $escaped))); 

echo "\n"; 

# Output should be 
# Hello % World: You'll find your reservation under/

?> 
+2

배열 순서대로 수행합니까? 확실하지는 않습니다. 마지막으로 배열을 변경하면 어떻게 될까요? str_replace (배열 ('% c', '% s', %% '), 배열 (': ','/ ','% ')) – stephenbayer

+0

@stephenbayer 죄송합니다. 회신을 처음 읽으십시오. 좋은 해결책이라면 모든 경우에 작동하는지 확인하겠습니다. – romaninsh

+0

@stephenbayer 아니요 작동하지 않아서 대신 % :가 생성됩니다. – romaninsh

답변

3

:

+0

사소한 수정 작업 : preg_replace_callback ('/ % [% cs] /'), function ($ match) { $ trans = array ('%%'=> '%', '% c'=> ':' , '% s'=> '/'); return $ trans [$ match [0]]; }, $ str) – romaninsh

+0

@romaninsh : 문제가 해결되었습니다. – Gumbo

+0

신난다, 고마워! – romaninsh

1

당신은 (임시 마커)를 preg_replace 파이프 라인을 사용할 수

preg_replace_callback('/%([%cs])/', function($match) { 
    $trans = array('%' => '%', 'c' => ':', 's' => '/'); 
    return $trans[$match[1]]; 
}, $str) 
+0

try $ escaped = "Hello %% c"; 당신은 "Hello :"를 얻을 것이고 이것은 정확한 문제입니다. "Hello % c"를 얻어야합니다; – romaninsh

+0

@romaninsh : 임시 마커로 문제를 해결할 수 있습니다 (내 편집 참조). – miku

0

심사에서 "%% c"에서 "%"c "로 바로 이동하지 않고"%% c "에서": "로 이동하려는 주석)을 사용하는 경우 Gumbo의 방법을 조금 수정하면 사용할 수 있습니다.

$unescaped = preg_replace_callback('/%(%[%cs])/', function($match) { 
    return $match[1]; 
}, $escaped); 
관련 문제