검색어를 입력하면 양식이에 제출되는 검색 페이지를 만들고 search.php?query=your query
있습니다. 어떤 PHP 기능이 가장 좋으며 검색 쿼리를 인코딩 / 디코딩하는 데 사용해야합니까?
답변
URI 쿼리의 경우 urlencode
/ urldecode
; 다른 용도로 사용하려면 rawurlencode
/ rawurldecode
.
차이 urlencode
하고 rawurlencode
있다는 것이다
urlencode
application / x-www-form-urlencoded 에 따라 인코딩합니다 (공백은로 인코딩 됨+
).rawurlencode
일반 백분율 인코딩에 따라 인코딩합니다 (공백은로 인코딩 됨%20
).
답변
답변
다음은 예외적 인 양의 인코딩이 필요한 사용 사례입니다. 인위적이라고 생각할 수도 있지만 우리는 이것을 프로덕션에서 실행합니다. 우연히 이것은 모든 유형의 인코딩을 다루므로 자습서로 게시하고 있습니다.
사용 사례 설명
누군가 우리 웹 사이트에서 선불 기프트 카드 ( “토큰”)를 구입했습니다. 토큰에는 사용할 수있는 해당 URL이 있습니다. 이 고객은 다른 사람에게 URL을 이메일로 보내려고합니다. 우리 웹 페이지에는 mailto
그렇게 할 수 있는 링크가 포함되어 있습니다.
PHP 코드
// 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>';
참고 : 위의 내용은 text/html
문서 로 출력한다고 가정합니다 . 출력 미디어 유형이 text/json
이면 $retval['url'] = $mailToUri;
출력 인코딩이 json_encode()
.
테스트 케이스
- PHP 테스트 사이트에서 코드를 실행합니다 ( 여기에 언급해야 할 표준 코드 가 있습니까? ).
- 링크를 클릭
- 이메일 보내기
- 이메일 받기
- 해당 링크를 클릭
넌 봐야 해:
"args": {
"token": "w%a&!e#\"^2(^@azW"
},
물론 이것은 $token
위 의 JSON 표현입니다 .
답변
URL 인코딩 기능을 사용할 수 있습니다. PHP에는
rawurlencode()
함수
ASP에는
Server.URLEncode()
함수
JavaScript에서는
encodeURIComponent()
함수.
답변
수행하려는 RFC 표준 인코딩 유형에 따라 또는 인코딩을 사용자 정의해야하는 경우 고유 한 클래스를 만들 수 있습니다.
/**
* 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;
}
}
}
사용 예 :
$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);
다음을 출력합니다.
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)"
* RFC 표준에 대한 자세한 내용 :
https://datatracker.ietf.org/doc/rfc3986/
및 urlencode 대 rawurlencode?