I'm removing certain characters from the string by substituting them:
% -> %%
: -> %c
/ -> %s
The string "%c" is properly escaped into %%c. However when I try to reverse it back with str_replace( array('%%','%c','%s'), array('%',':','/'), $s) it converts it into ":". That's proper behaviour of str_replace as per documentation, that's why I'm looking into solution with Regular Expressions.
Please suggest, what should I use to properly decode esc开发者_C百科aped string. Thank you.
You need to do the replacement for all escape sequences at once and not successively:
preg_replace_callback('/%([%cs])/', function($match) {
$trans = array('%' => '%', 'c' => ':', 's' => '/');
return $trans[$match[1]];
}, $str)
You could use a preg_replace pipeline (with a temporary marker):
<?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 /
?>
Judging from your comment (that you want to go from "%%c" to "%c", and not from "%%c" straight to ":"), you can use Gumbo's method with a little modification, I think:
$unescaped = preg_replace_callback('/%(%[%cs])/', function($match) {
return $match[1];
}, $escaped);
精彩评论