2013-10-25 52 views
1

好吧,如果我urlencode包含空格,感嘆號,單引號等字符串,並在頁面中回顯它,我看到包含感嘆號的字符串已被編碼爲一個會期待。但是,如果將編碼的字符串置於<a href=中,感嘆號和單引號不再編碼,並且CI將引發有關URL中不允許的字符的錯誤。Codeigniter urlencode感嘆號鏈接不工作

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

它不輸出任何不同,真的,因爲你可以看到,當你運行你的代碼是(刪除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中的任何此類字符。

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

這是最佳答案。是的,我只在Firefox中嘗試過,因爲我從CI獲取錯誤,我沒有嘗試在其他瀏覽器中使用。自從我在控制器中放入一個函數來接收鏈接後,CI錯誤就消失了。但是,通過我,因爲我會期待404而不是無效的字符錯誤。感謝您直視我的愚蠢。 – Ally

0

使用stripslashes()

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