Tôi đang tạo một trang tìm kiếm, nơi bạn nhập một truy vấn tìm kiếm và biểu mẫu được gửi đến search.php?query=your query
. Hàm PHP nào là tốt nhất và tôi nên sử dụng để mã hóa / giải mã truy vấn tìm kiếm?
file_get_contents
Tôi đang tạo một trang tìm kiếm, nơi bạn nhập một truy vấn tìm kiếm và biểu mẫu được gửi đến search.php?query=your query
. Hàm PHP nào là tốt nhất và tôi nên sử dụng để mã hóa / giải mã truy vấn tìm kiếm?
file_get_contents
Câu trả lời:
Đối với truy vấn URI, hãy sử dụng urlencode
/ urldecode
; cho bất cứ điều gì khác sử dụng rawurlencode
/ rawurldecode
.
Sự khác biệt giữa urlencode
và rawurlencode
là
urlencode
mã hóa theo ứng dụng / x-www-form-urlencoded (dấu cách được mã hóa bằng +
) trong khirawurlencode
mã hóa theo Percent-Encoding đơn giản (không gian được mã hóa bằng %20
).+
thay vì %20
. Và bên cạnh đó, application / x-www-form-urlencoded được sử dụng để mã hóa dữ liệu biểu mẫu trong khi Percent-Encoding có cách sử dụng chung hơn.
urldecode
. Sau đó, những gì về đường dẫn URI (ví dụ /a/path with spaces/
) và phân đoạn URI (ví dụ #fragment
). Tôi có nên luôn luôn sử dụng rawurldecode
cho hai?
rawurlencode
; nhưng đối với POST và GET lĩnh vực đi với urlencode
(Giống như / folder = thư mục của tôi +?) `
Các cunningly tên urlencode () và urldecode () .
Tuy nhiên, bạn không cần phải sử dụng urldecode()
trên các biến xuất hiện trong $_POST
và $_GET
.
"name=b&age=c&location=d"
) được gửi đến tệp PHP qua AJAX không?
Đây là trường hợp sử dụng của tôi, yêu cầu số lượng mã hóa đặc biệt. Có thể bạn nghĩ rằng nó đã tạo ra, nhưng chúng tôi chạy điều này trên sản xuất. Thật trùng hợp, điều này bao gồm mọi loại mã hóa, vì vậy tôi đăng dưới dạng hướng dẫn.
Ai đó vừa mua thẻ quà tặng trả trước ("mã thông báo") trên trang web của chúng tôi. Token có các URL tương ứng để đổi chúng. Khách hàng này muốn gửi URL qua email cho người khác. Trang web của chúng tôi bao gồm một mailto
liên kết cho phép họ làm điều đó.
// The order system generates some opaque token
$token = 'w%a&!e#"^2(^@azW';
// Here is a URL to redeem that token
$redeemUrl = 'https://httpbin.org/get?token=' . urlencode($token);
// Actual contents we want for the email
$subject = 'I just bought this for you';
$body = 'Please enter your shipping details here: ' . $redeemUrl;
// A URI for the email as prescribed
$mailToUri = 'mailto:?subject=' . rawurlencode($subject) . '&body=' . rawurlencode($body);
// Print an HTML element with that mailto link
echo '<a href="' . htmlspecialchars($mailToUri) . '">Email your friend</a>';
Lưu ý: ở trên giả sử bạn đang xuất ra một text/html
tài liệu. Nếu loại phương tiện đầu ra của bạn text/json
thì chỉ cần sử dụng $retval['url'] = $mailToUri;
vì mã hóa đầu ra được xử lý bởijson_encode()
.
Bạn nên thấy:
"args": {
"token": "w%a&!e#\"^2(^@azW"
},
Và tất nhiên đây là đại diện JSON $token
ở trên.
mailto:
Bạn có thể sử dụng một cách tương đương và ít ngữ nghĩa hơn (vì không phải là HTTP) $mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);
.
Bạn có thể sử dụng các chức năng mã hóa URL PHP có
rawurlencode()
chức năng
ASP có
Server.URLEncode()
chức năng
Trong JavaScript, bạn có thể sử dụng
encodeURIComponent()
chức năng.
Dựa trên loại mã hóa tiêu chuẩn RFC bạn muốn thực hiện hoặc nếu bạn cần tùy chỉnh mã hóa của mình, bạn có thể muốn tạo lớp của riêng mình.
/**
* UrlEncoder make it easy to encode your URL
*/
class UrlEncoder{
public const STANDARD_RFC1738 = 1;
public const STANDARD_RFC3986 = 2;
public const STANDARD_CUSTOM_RFC3986_ISH = 3;
// add more here
static function encode($string, $rfc){
switch ($rfc) {
case self::STANDARD_RFC1738:
return urlencode($string);
break;
case self::STANDARD_RFC3986:
return rawurlencode($string);
break;
case self::STANDARD_CUSTOM_RFC3986_ISH:
// Add your custom encoding
$entities = ['%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D'];
$replacements = ['!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]"];
return str_replace($entities, $replacements, urlencode($string));
break;
default:
throw new Exception("Invalid RFC encoder - See class const for reference");
break;
}
}
}
Sử dụng ví dụ:
$dataString = "https://www.google.pl/search?q=PHP is **great**!&id=123&css=#kolo&email=me@liszka.com)";
$dataStringUrlEncodedRFC1738 = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_RFC1738);
$dataStringUrlEncodedRFC3986 = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_RFC3986);
$dataStringUrlEncodedCutom = UrlEncoder::encode($dataString, UrlEncoder::STANDARD_CUSTOM_RFC3986_ISH);
Sẽ xuất:
string(126) "https%3A%2F%2Fwww.google.pl%2Fsearch%3Fq%3DPHP+is+%2A%2Agreat%2A%2A%21%26id%3D123%26css%3D%23kolo%26email%3Dme%40liszka.com%29"
string(130) "https%3A%2F%2Fwww.google.pl%2Fsearch%3Fq%3DPHP%20is%20%2A%2Agreat%2A%2A%21%26id%3D123%26css%3D%23kolo%26email%3Dme%40liszka.com%29"
string(86) "https://www.google.pl/search?q=PHP+is+**great**!&id=123&css=#kolo&email=me@liszka.com)"
* Tìm hiểu thêm về các tiêu chuẩn RFC: https://datatracker.ietf.org/doc/rfc3986/ và urlencode so với rawurlencode?
foo bar
vào trường văn bản, tạofoo+bar
trong URL).