好的,如果我对包含空格,惊叹号,单引号等的字符串进行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! -->
魔鬼在这里发生了什么?
答案 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));