1

好的,所以如果我对包含空格、感叹号、单引号等的字符串进行 urlencode 并在页面中回显它,我会看到包含感叹号的字符串已按照预期进行编码。但是,如果我将编码的字符串放在<a href=感叹号中并且单引号不再编码,那么 CI 会抛出关于 url 中不允许的字符的错误。

<?
$string = 'Hello\'s world!';
$url = urlencode(stringtolower($string));

// echo it
echo $url; // outputs: hello%27s+world%21
?>

<a href="<? echo base_url() . $url; ?>">Link</>' <!-- outputs: ./hello's+world! -->

魔鬼在这里发生了什么?

4

2 回答 2

2

实际上,它并没有输出任何不同的东西,正如您在命令行上按原样运行代码(删除 base_url()-call)时所看到的那样;然后你得到:

hello%27s+world%21
<a href="hello%27s+world%21">link</a>   

我假设您正在查看浏览器中的链接,该链接向您显示状态栏中的第二个变体。

一项快速测试表明,在 Mac 上 Chrome 和 Safari 不会这样做,但我假设您正在使用 Firefox 会这样做。所以不用担心。如果您直接在地址字段中输入 hello%27s+world%21 变体,它也会自动切换到更易读的变体。

至于CI错误。并非所有字符都允许通过内部 URI 处理传递,您可以调整permitted_uri_chars配置文件中的设置,或者将参数作为 GET 变量传递,如果您在 url 中确实需要任何此类字符。

/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| ....
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.,:_\-';
于 2013-10-25T08:51:07.483 回答
0

使用stripslashes()

$string = stripslashes( 'Hello\'s world!' );
$url = urlencode(stringtolower($string));
于 2013-10-25T08:22:28.083 回答