Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用正则表达式取消转义字符_Php_Regex - Fatal编程技术网

Php 使用正则表达式取消转义字符

Php 使用正则表达式取消转义字符,php,regex,Php,Regex,我正在通过替换从字符串中删除某些字符: % -> %% : -> %c / -> %s 字符串“%c”已正确转义到%%c中。但是,当我尝试用str_replace(数组(“%”、“%c”、“s”)、数组(“%”、“:”、“/”)、$s)将其反转回来时,它会将其转换为“:”。根据文档,这是str_replace的正确行为,这就是我研究正则表达式解决方案的原因 请建议,我应该使用什么来正确解码转义字符串。谢谢。您可以使用管道(带有临时标记): 您可以使用管道(带有临时标记): 您

我正在通过替换从字符串中删除某些字符:

% -> %%
: -> %c
/ -> %s
字符串“%c”已正确转义到%%c中。但是,当我尝试用str_replace(数组(“%”、“%c”、“s”)、数组(“%”、“:”、“/”)、$s)将其反转回来时,它会将其转换为“:”。根据文档,这是str_replace的正确行为,这就是我研究正则表达式解决方案的原因

请建议,我应该使用什么来正确解码转义字符串。谢谢。

您可以使用管道(带有临时标记):

您可以使用管道(带有临时标记):


您需要一次而不是连续地替换所有转义序列:

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

您需要一次而不是连续地替换所有转义序列:

preg_replace_callback('/%([%cs])/', function($match) {
    $trans = array('%' => '%', 'c' => ':', 's' => '/');
    return $trans[$match[1]];
}, $str)
从您的评论判断(您希望从“%%c”转到“%c”,而不是从“%%c”直接转到“:”),您可以使用Gumbo的方法,稍加修改,我认为:

$unescaped = preg_replace_callback('/%(%[%cs])/', function($match) {
    return $match[1];
}, $escaped);
从您的评论判断(您希望从“%%c”转到“%c”,而不是从“%%c”直接转到“:”),您可以使用Gumbo的方法,稍加修改,我认为:

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

它是否按照数组的顺序进行操作?我不确定,如果您将数组更改为最后一个%。str_replace(数组(“%c”、“s”、“%”)、数组(“:”、“/”、“%”))@stephenbayer抱歉,错过了第一次阅读您的回复。看起来是个不错的解决方案,让我试试看它是否在所有情况下都能工作。@stephenbayer不,它不工作,它产生%:相反。@romaninsh:我有点困惑:“:”变成了“%c”,然后转义到“%c”“。那么您想将其反转义回“%c”,对吗?因为从“str_replace”参数来看,您似乎一直试图返回到原始字符串,您说它也是这样做的。@Flambino,不,原始字符串是“%c”,转义时会变成“%%c”。如果取消转义,它应该返回到“%c”。我在取消转义时遇到问题。它是否按照数组的顺序执行?我不确定,如果您将数组更改为最后一个%。str_replace(数组(“%c”、“s”、“%”)、数组(“:”、“/”、“%”))@stephenbayer抱歉,错过了第一次阅读您的回复。看起来是个不错的解决方案,让我试试看它是否在所有情况下都能工作。@stephenbayer不,它不工作,它产生%:相反。@romaninsh:我有点困惑:“:”变成了“%c”,然后转义到“%c”“。那么您想将其反转义回“%c”,对吗?因为从“str_replace”参数来看,您似乎一直试图返回到原始字符串,您说它也是这样做的。@Flambino,不,原始字符串是“%c”,转义时会变成“%%c”。如果取消转义,它应该返回到“%c”。我在取消转义时遇到问题。请尝试$escape=“Hello%%c”;你会得到“你好”,这正是我遇到的问题。我应该得到“你好%c”@romaninsh:您的问题可以通过临时标记解决(请参阅我的编辑)。请尝试$escape=“Hello%%c”;你会得到“你好”,这正是我遇到的问题。我应该得到“你好%c”@romaninsh:你的问题可以用一个临时标记来解决(参见我的编辑)。使用小修改:preg_replace_回调('/%[%cs]/',函数($match){$trans=array('%%'=>'%','%c'=>':','%s'=>'/');返回$trans[$match[0]];},$str使用小修改:preg_replace_回调('/%[%cs]/,函数($match){$trans=array('%%'=>'%','%c'=>':','%s'=>'/');返回$trans[$match[0]];},$str)