我有以下正则表达式:
$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 :(得分: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类的初始位置不必被转义。同样适用于{
,}
以及[
,但该方括号可以更好地转义(某些正则表达式不允许在字符类中使用未转义的[
)。