如何让PHP忽略查询字符串中未转义的&符号(例如?name = M& M's不会成为数组('name'=>'M','M \'s'=>''))

时间:2010-12-10 10:32:45

标签: regex mod-rewrite

使用以下网址:http://any.php?name=M&M's

PHP的$_GET变量为array('name' => 'M', 'M\s' => '')

有没有办法让PHP忽略那些未转义的&符号?

------ 早期问题(导致上述问题)------

大家好,

使用像这样的mod_rewrite规则......

RewriteRule ^wiki/([A-Za-z0-9_,+&'\-\)\(]+)$ php/data.php?name=$1 [L,NC]

这样的链接(用纯文本,即M& M's)......

http://any.com/wiki/M%26M%27s

我从data.php ...

得到这个

<?php echo 'Name:'. $_GET['name']; ?>

Name: M

其他名字怎么了?

谢谢!

2 个答案:

答案 0 :(得分:0)

我不知道这是否有帮助,但您确定需要范围表达式中的反斜杠吗?通常你不需要在那里转义括号(它们永远不合法),并且你也不会逃脱连字符:你把它包含在第一个或最后一个位置。所以你的行将是:

RewriteRule ^wiki/([-A-Za-z0-9_,+&')(]+)$ php/data.php?name=$1 [L,NC]

而且,再一次,我不知道mod_rewrite,所以我只是在黑暗中进行两次刺伤但是:

  1. 正好在“php”之前的$是正则表达式的一部分,还是某种变量引用?有混乱吗?
  2. 您确定此规则应该在撤消的网址版本上运行吗?如果它被传递了一个包含%'s的字符串,那么你的正则表达式应该包含%'...没有?

答案 1 :(得分:0)

所以我做了一些测试,看起来像PHP的错!

首先,在运行重写规则之前,mod_rewrite似乎对任何字符进行解码。如果我从我的正则表达式的字符类中删除“$”和“'”(或者像Steve建议的那样添加“%”),我会收到404错误。因此,我的RewriteRule的语法和mod_rewrite看起来越来越好(特别是在像Steve建议的那样清理之后)。

如果我转储页面的$_GET变量,我会看到:

<?php var_dump($_GET); ?>
array(2) { ["name"]=> string(8) "Almond_M" ["M\'s"]=> string(0) "" } 

哈!这是一个PHP问题!所以现在的问题是,如何让PHP忽略未转义的&符号(我希望保持它不会转义,因此对用户来说看起来很漂亮)。