PHP에서 문자열을 올바르게 URL 인코딩하는 방법은 무엇입니까?


97

검색어를 입력하면 양식이에 제출되는 검색 페이지를 만들고 search.php?query=your query있습니다. 어떤 PHP 기능이 가장 좋으며 검색 쿼리를 인코딩 / 디코딩하는 데 사용해야합니까?


2
문제가 있습니까? 브라우저와 PHP는 이미이를 자동으로 처리해야합니다 (예 : foo bar텍스트 필드 입력, foo+barURL 생성 ).
Felix Kling 2011 년

@Felix 나는 다음을 사용하여 검색 자 스크립트를 호출 할 것입니다file_get_contents
Click Upvote

답변:


183

URI 쿼리의 경우 urlencode/ urldecode; 다른 용도로 사용하려면 rawurlencode/ rawurldecode.

차이 urlencode하고 rawurlencode있다는 것이다


application / x-www-form-urlencodedPercent-Encoding 의 특별한 변형이며 HTML 양식 데이터를 인코딩하는 데만 적용됩니다.
Gumbo

1
@Click Upvote : 그런 식으로 비교할 수 없습니다. 애플리케이션 / x-www-form-urlencoded를 포맷 이다 퍼센트 인코딩 공간이 함께 인코딩되는 것을 제외하고 형식 +대신 %20. 그 외에도 application / x-www-form-urlencoded 는 양식 데이터를 인코딩하는 데 사용되는 반면 Percent-Encoding 은 더 일반적인 용도로 사용됩니다.
Gumbo 2011 년

12
rawurlencode ()는 자바 스크립트와 호환 decodeURI () 함수
클라이브 패터슨

이 규칙은 항상 경험적인 규칙입니까? 즉, 쿼리 문자열을 인코딩해야 할 때 항상 urldecode. 그런 다음 URI 경로 (예 /a/path with spaces/:) 및 URI 조각 (예 :) 은 어떻습니까 #fragment? rawurldecode이 두 가지를 항상 사용해야 합니까?
tonix

경험상 좋은 규칙은 경로 (예 : / my % 20folder /)가 함께 이동하는 것입니다 rawurlencode. 하지만 POST 및 GET 필드의 경우 urlencode(Like /? folder = my + folder)`
Soroush Falahati

22

교활한 이름의 urlencode ()urldecode () .

그러나 및에 urldecode()나타나는 변수 에는 사용할 필요가 없습니다 .$_POST$_GET


4
urldecode ()를 $ _POST와 함께 사용하면 안되는 이유를 설명해 주시겠습니까? 오래 전부터 아무 문제없이 해왔거든요.
sid

"name=b&age=c&location=d"AJAX를 통해 PHP 파일로 전송 된 기본 매개 변수 (예 :)를 인코딩해야 합니까?
올드 보이

9

다음은 예외적 인 양의 인코딩이 필요한 사용 사례입니다. 인위적이라고 생각할 수도 있지만 우리는 이것을 프로덕션에서 실행합니다. 우연히 이것은 모든 유형의 인코딩을 다루므로 자습서로 게시하고 있습니다.

사용 사례 설명

누군가 우리 웹 사이트에서 선불 기프트 카드 ( "토큰")를 구입했습니다. 토큰에는 사용할 수있는 해당 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().

테스트 케이스

  1. PHP 테스트 사이트에서 코드를 실행합니다 ( 여기에 언급해야 할 표준 코드 가 있습니까? ).
  2. 링크를 클릭
  3. 이메일 보내기
  4. 이메일 받기
  5. 해당 링크를 클릭

넌 봐야 해:

"args": {
  "token": "w%a&!e#\"^2(^@azW"
}, 

물론 이것은 $token위 의 JSON 표현입니다 .


mailto:HTTP가 아니기 때문에 의미 론적으로는 동등하고 덜 의미 가 있으므로 $mailToUri 'mailto:?' . http_build_query(['subject'=>$subject, 'body'=>$body], null, '&', PHP_QUERY_RFC3986);.
William Entriken

0

URL 인코딩 기능을 사용할 수 있습니다. PHP에는

rawurlencode() 

함수

ASP에는

Server.URLEncode() 

함수

JavaScript에서는

encodeURIComponent() 

함수.


0

수행하려는 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?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.