Tương đương với encodeURIcomponent của JavaScript trong PHP là gì?


Câu trả lời:


141

Cố gắng rawurlencode. Hay nói chính xác hơn:

function encodeURIComponent($str) {
    $revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')');
    return strtr(rawurlencode($str), $revert);
}

Hàm này hoạt động chính xác như cách encodeURIComponentđược định nghĩa :

encodeURIComponent thoát tất cả các ký tự ngoại trừ các ký tự sau: chữ cái, chữ số thập phân, - _ . ! ~ * ' ( )


Cảm ơn bạn! Tôi nghĩ rằng tôi có thể làm điều đó mà không cần một chức năng, nhưng ok.
Gal

1
@Gal: Bạn sẽ chỉ cần chức năng đó nếu bạn cần một đầu ra giống hệt nhau.
Gumbo

@Gumbo Trong tiện ích mở rộng của firefox cho tìm kiếm Google Image, tôi nhận thấy rằng họ chuyển một hình ảnh tới mã hóa javascriptURIComponent. Xem addons.mozilla.org/nl/firefox/files/browse/126380/file/chrome/… , dòng 137. Làm cách nào để làm điều tương tự trong PHP?
user410932

Cảm ơn Gumbo. Điều đó rất hữu ích!
Marvin Thobejane

Tôi không tin rằng mã rawlurlencode mã hóa dấu phẩy (điều này cần được thực hiện cho các thành phần URI).
Chris Rae

6

Bạn đã thử urlencode?


1
Đúng. vấn đề là nó không hoàn toàn giống như encodeURI, nó chuyển đổi mọi ký tự, thậm chí ^ Tôi muốn một cái gì đó sẽ hoạt động theo cùng một cách mà tôi không cần phải can thiệp ^^.
Gal

2

mã hóa hàmURIComponent ($ string) {
   $ kết quả = "";
   for ($ i = 0; $ i <strlen ($ string); $ i ++) {
      $ result. = encodeURIComponentbycharacter (urlencode ($ string [$ i]));
   }
   trả về kết quả $;
}

mã hóa hàmURIComponentbycharacter ($ char) { if ($ char == "+") {return "% 20"; } if ($ char == "% 21") {return "!"; } if ($ char == "% 27") {return '"';} if ($ char == "% 28") {return "(";} if ($ char == "% 29") {return ")"; } if ($ char == "% 2A") {return "*"; } if ($ char == "% 7E") {return "~"; } if ($ char == "% 80") {return "% E2% 82% AC"; } if ($ char == "% 81") {return "% C2% 81"; } if ($ char == "% 82") {return "% E2% 80% 9A"; } if ($ char == "% 83") {return "% C6% 92"; } if ($ char == "% 84") {return "% E2% 80% 9E"; } if ($ char == "% 85") {return "% E2% 80% A6"; } if ($ char == "% 86") {return "% E2% 80% A0"; } if ($ char == "% 87") {return "% E2% 80% A1"; } if ($ char == "% 88") {return "% CB% 86"; } if ($ char == "% 89") {return "% E2% 80% B0"; } if ($ char == "% 8A") {return "% C5% A0"; } if ($ char == "% 8B") {return "% E2% 80% B9"; } if ($ char == "% 8C") {return "% C5% 92"; } if ($ char == "% 8D") {return "% C2% 8D"; } if ($ char == "% 8E") {return "% C5% BD"; } if ($ char == "% 8F") {return "% C2% 8F"; } if ($ char == "% 90") {return "% C2% 90"; } if ($ char == "% 91") {return "% E2% 80% 98"; } if ($ char == "% 92") {return "% E2% 80% 99"; } if ($ char == "% 93") {return "% E2% 80% 9C"; } if ($ char == "% 94") {return "% E2% 80% 9D"; } if ($ char == "% 95") {return "% E2% 80% A2"; } if ($ char == "% 96") {return "% E2% 80% 93"; } if ($ char == "% 97") {return "% E2% 80% 94"; } if ($ char == "% 98") {return "% CB% 9C"; } if ($ char == "% 99") {return "% E2% 84% A2"; } if ($ char == "% 9A") {return "% C5% A1"; } if ($ char == "% 9B") {return "% E2% 80% BA"; } if ($ char == "% 9C") {return "% C5% 93"; } if ($ char == "% 9D") {return "% C2% 9D"; } if ($ char == "% 9E") {return "% C5% BE"; } if ($ char == "% 9F") {return "% C5% B8"; } if ($ char == "% A0") {return "% C2% A0"; } if ($ char == "% A1") {return "% C2% A1"; } if ($ char == "% A2") {return "% C2% A2"; } if ($ char == "% A3") {return "% C2% A3"; } if ($ char == "% A4") {return "% C2% A4"; } if ($ char == "% A5") {return "% C2% A5"; } if ($ char == "% A6") {return "% C2% A6"; } if ($ char == "% A7") {return "% C2% A7"; } if ($ char == "% A8") {return "% C2% A8"; } if ($ char == "% A9") {return "% C2% A9"; } if ($ char == "% AA") {return "% C2% AA"; } if ($ char == "% AB") {return "% C2% AB"; } if ($ char == "% AC") {return "% C2% AC"; } if ($ char == "% AD") {return "% C2% AD"; } if ($ char == "% AE") {return "% C2% AE"; } if ($ char == "% AF") {return "% C2% AF"; } if ($ char == "% B0") {return "% C2% B0"; } if ($ char == "% B1") {return "% C2% B1"; } if ($ char == "% B2") {return "% C2% B2"; } if ($ char == "% B3") {return "% C2% B3"; } if ($ char == "% B4") {return "% C2% B4"; } if ($ char == "% B5") {return "% C2% B5"; } if ($ char == "% B6") {return "% C2% B6"; } if ($ char == "% B7") {return "% C2% B7"; } if ($ char == "% B8") {return "% C2% B8"; } if ($ char == "% B9") {return "% C2% B9"; } if ($ char == "% BA") {return "% C2% BA"; } if ($ char == "% BB") {return "% C2% BB"; } if ($ char == "% BC") {return "% C2% BC"; } if ($ char == "% BD") {return "% C2% BD"; } if ($ char == "% BE") {return "% C2% BE"; } if ($ char == "% BF") {return "% C2% BF"; } if ($ char == "% C0") {return "% C3% 80"; } if ($ char == "% C1") {return "% C3% 81"; } if ($ char == "% C2") {return "% C3% 82"; } if ($ char == "% C3") {return "% C3% 83"; } if ($ char == "% C4") {return "% C3% 84"; } if ($ char == "% C5") {return "% C3% 85"; } if ($ char == "% C6") {return "% C3% 86"; } if ($ char == "% C7") {return "% C3% 87"; } if ($ char == "% C8") {return "% C3% 88"; } if ($ char == "% C9") {return "% C3% 89"; } if ($ char == "% CA") {return "% C3% 8A"; } if ($ char == "% CB") {return "% C3% 8B"; } if ($ char == "% CC") {return "% C3% 8C"; } if ($ char == "% CD") {return "% C3% 8D"; } if ($ char == "% CE") {return "% C3% 8E"; } if ($ char == "% CF") {return "% C3% 8F"; } if ($ char == "% D0") {return "% C3% 90"; } if ($ char == "% D1") {return "% C3% 91"; } if ($ char == "% D2") {return "% C3% 92"; } if ($ char == "% D3") {return "% C3% 93"; } if ($ char == "% D4") {return "% C3% 94"; } if ($ char == "% D5") {return "% C3% 95"; } if ($ char == "% D6") {return "% C3% 96"; } if ($ char == "% D7") {return "% C3% 97"; } if ($ char == "% D8") {return "% C3% 98"; } if ($ char == "% D9") {return "% C3% 99"; } if ($ char == "% DA") {return "% C3% 9A"; } if ($ char == "% DB") {return "% C3% 9B"; } if ($ char == "% DC") {return "% C3% 9C"; } if ($ char == "% DD") {return "% C3% 9D"; } if ($ char == "% DE") {return "% C3% 9E"; } if ($ char == "% DF") {return "% C3% 9F"; } if ($ char == "% E0") {return "% C3% A0"; } if ($ char == "% E1") {return "% C3% A1"; } if ($ char == "% E2") {return "% C3% A2"; } if ($ char == "% E3") {return "% C3% A3"; } if ($ char == "% E4") {return "% C3% A4"; } if ($ char == "% E5") {return "% C3% A5"; } if ($ char == "% E6") {return "% C3% A6"; } if ($ char == "% E7") {return "% C3% A7"; } if ($ char == "% E8") {return "% C3% A8"; } if ($ char == "% E9") {return "% C3% A9"; } if ($ char == "% EA") {return "% C3% AA"; } if ($ char == "% EB") {return "% C3% AB"; } if ($ char == "% EC") {return "% C3% AC"; } if ($ char == "% ED") {return "% C3% AD"; } if ($ char == "% EE") {return "% C3% AE"; } if ($ char == "% EF") {return "% C3% AF"; } if ($ char == "% F0") {return "% C3% B0"; } if ($ char == "% F1") {return "% C3% B1"; } if ($ char == "% F2") {return "% C3% B2"; } if ($ char == "% F3") {return "% C3% B3"; } if ($ char == "% F4") {return "% C3% B4"; } if ($ char == "% F5") {return "% C3% B5"; } if ($ char == "% F6") {return "% C3% B6"; } if ($ char == "% F7") {return "% C3% B7"; } if ($ char == "% F8") {return "% C3% B8"; } if ($ char == "% F9") {return "% C3% B9"; } if ($ char == "% FA") {return "% C3% BA"; } if ($ char == "% FB") {return "% C3% BB"; } if ($ char == "% FC") {return "% C3% BC"; } if ($ char == "% FD") {return "% C3% BD"; } if ($ char == "% FE") {return "% C3% BE"; } if ($ char == "% FF") {return "% C3% BF"; } trả về $ char; }


Đây là lúc mà tuyên bố chuyển đổi có ích
Yada

2
Logic của câu trả lời là có thể tranh cãi đối với tôi, dù sao thì cả chuỗi IF hoặc SWITCH đều không hoạt động tốt trong trường hợp này. Đây là trường hợp điển hình trong đó mảng được lập chỉ mục là giải pháp tốt nhất, trong đó giá trị tra cứu là khóa.
Emanuele Del Grande

0

mã này như thế nào?
Tôi đã mã hóa từng lớp.
thực ra nó không giống như encodeURI, nhưng bạn có thể mã hóa trừ tên máy chủ và "/"

function encodeURI($url) {
    if(__empty($url))return $url; 

    $res = preg_match('/.*:\/\/(.*?)\//',$url,$matches);
    if($res){

        // except host name
        $url_tmp = str_replace($matches[0],"",$url);

        // except query parameter
        $url_tmp_arr = explode("?",$url_tmp);

        // encode each tier
        $url_tear = explode("/", $url_tmp_arr[0]);
        foreach ($url_tear as $key => $tear){
            $url_tear[$key] = rawurlencode($tear);
        }

        $ret_url = $matches[0].implode('/',$url_tear);

        // encode query parameter
        if(count($url_tmp_arr) >= 2){
            $ret_url .= "?".$this->encodeURISub($url_tmp_arr[1]);
        }
        return $ret_url;
    }else{
        return $this->encodeURISub($url);
    }

}

/**
 * /programming/4929584/encodeuri-in-php/6059053
 */
function encodeURISub($url) {
    // http://php.net/manual/en/function.rawurlencode.php
    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURI
    $unescaped = array(
    '%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~',
    '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')'
            );
    $reserved = array(
            '%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','%3A'=>':',
            '%40'=>'@','%26'=>'&','%3D'=>'=','%24'=>'$'
    );
    $score = array(
            '%23'=>'#'
    );
    return strtr(rawurlencode($url), array_merge($reserved,$unescaped,$score));

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.