Codeigniter urlencode感叹号在链接不起作用

时间:2013-10-25 08:18:10

标签: php codeigniter urlencode

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

<?
$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! -->

魔鬼在这里发生了什么?

2 个答案:

答案 0 :(得分:2)

它不会输出任何不同的内容,因为您可以在命令行上按原样运行代码(使用已删除的base_url() - 调用);然后你得到:

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中的任何此类字符。 / p>

/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| ....
*/
$config['permitted_uri_chars'] = 'a-z 0-9~%.,:_\-';

答案 1 :(得分:0)

使用stripslashes()

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