2011-01-24 83 views
14

我一直與URL/HTML編碼/轉義混淆。我正在使用PHP,所以想清除一些東西。URL/HTML轉義/編碼

我可以說,我應該總是使用

  • urlencode:單項查詢字符串部分

    $url = 'http://test.com?param1=' . urlencode('some data') . '&param2=' . urlencode('something else'); 
    
  • htmlentities:轉義特殊字符,如<>因此,如果將適當地呈現瀏覽器

會有其他地方我可能會使用每個功能。我並不擅長處理這些逃跑的東西,總是被它們所迷惑

回答

29

首先,你不應該使用htmlentites 99%左右的時間。相反,您應該使用htmlspecialchars()來轉義在xml/html文檔中使用的文本。 htmlentities僅用於顯示您正在使用的本機字符集無法顯示的字符(如果您的頁面使用ASCII,但您有一些想要顯示的UTF-8字符,則該字符很有用)。相反,只需製作整個頁面UTF-8(這並不難),並完成它。

只要urlencode,你擊中了頭部的指甲。

因此,回顧一下:

  • 內部HTML:

    <b><?php echo htmlspecialchars($string, ENT_QUOTES, "UTF-8"); ?></b> 
    
  • 內部URL的:

    $url = '?foo='.urlencode('bar'); 
    
18

這就是對的。雖然 - htmlspecialchars沒問題,只要你把你的數據直接寫出來。無論如何你應該這樣做。所以我傾向於使用它,所以如果我搞砸了,我會早點發現。

另外請注意,如果你把一個url放到html上下文中(比如說hrefa -tag),你需要轉義它。所以,你經常會看到這樣的:

echo "<a href='" . htmlspecialchars("?foo=".urlencode($foo)) . "'>clicky</a>" 
+0

偉大的答案。這是如何正確地在另一個上下文中爲上下文進行轉義的示例。值得注意的是,儘管urlencode永遠不會輸出任何特殊的html字符串來引發任何問題,但它並不會損害整個html屬性的內容。 – Phil 2016-10-14 21:27:50