在URL清理的正则表达式中包含反斜杠?

时间:2016-09-29 12:31:22

标签: php regex url

我有以下正则表达式:

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

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

我得到以下输出:

  

http://example.com?param=test1est2est3est4

但是, 我期待以下输出:

  

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

我尝试了这个正则表达式,但它不起作用:

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

1 个答案:

答案 0 :(得分:1)

也许,你正在做的事情可以通过其他方式实现,但回答你的问题,我应该注意你的输入字符串不包含反斜杠,它包含 tab 字符作为双引号字符串文字内,\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类的初始位置不必被转义。同样适用于{}以及[,但该方括号可以更好地转义(某些正则表达式不允许在字符类中使用未转义的[)。

相关问题