อะไรคือสิ่งที่เทียบเท่ากับ encodeURIcomponent ของ JavaScript ใน PHP?


คำตอบ:


143

ลองrawurlencode. หรือเพื่อให้แม่นยำยิ่งขึ้น:

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

ฟังก์ชั่นนี้ทำงานตรงวิธีการที่encodeURIComponentถูกกำหนด :

encodeURIComponent หลีกเลี่ยงอักขระทั้งหมดยกเว้นตัวอักษรต่อไปนี้: ตัวอักษรตัวเลขทศนิยม - _ . ! ~ * ' ( )


ขอบคุณ! ฉันคิดว่าฉันอาจจะทำได้โดยไม่ต้องใช้ฟังก์ชัน แต่ก็โอเค
กัล

1
@Gal: คุณจะต้องใช้ฟังก์ชันนั้นก็ต่อเมื่อคุณต้องการผลลัพธ์ที่เหมือนกัน
Gumbo

@Gumbo ในส่วนขยาย firefox สำหรับการค้นหารูปภาพของ Google ฉันสังเกตเห็นว่ามันส่งภาพไปยังการเข้ารหัสจาวาสคริปต์ UIComponent ดูaddons.mozilla.org/nl/firefox/files/browse/126380/file/chrome/…บรรทัด 137 ฉันจะทำสิ่งเดียวกันใน PHP ได้อย่างไร
user410932

ขอบคุณ Gumbo นั่นเป็นประโยชน์!
Marvin Thobejane

ฉันไม่เชื่อว่า rawlurlencode เข้ารหัสลูกน้ำ (ซึ่งต้องทำสำหรับคอมโพเนนต์ URI)
Chris Rae

6

คุณลองurlencodeหรือยัง?


2
ใช่. ปัญหาคือมันไม่เหมือนกับ encodeURI โดยสิ้นเชิงมันจะแปลงทุกอักขระแม้กระทั่ง ^ ฉันต้องการบางสิ่งที่จะทำงานในลักษณะเดียวกันโดยที่ฉันไม่ต้องเข้าไปแทรกแซง ^^
กัล

2

ฟังก์ชัน encodeURIComponent ($ string) {
   $ ผล = "";
   สำหรับ ($ i = 0; $ i <strlen ($ string); $ i ++) {
      $ result. = encodeURIComponentbycharacter (urlencode ($ string [$ i]));
   }
   ส่งคืนผลลัพธ์ $;
}

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


นี่คือสิ่งที่คำสั่งสวิตช์มีประโยชน์
ญาดา

2
ตรรกะของคำตอบเป็นที่ถกเถียงกันสำหรับฉันไม่ว่าในกรณีนี้โซ่ IF หรือ SWITCH จะทำงานได้ดี นี่เป็นกรณีทั่วไปที่อาร์เรย์ที่จัดทำดัชนีเป็นทางออกที่ดีที่สุดโดยที่ค่าการค้นหาเป็นกุญแจสำคัญ
yodabar

0

รหัสนี้เป็นอย่างไร
ฉันเข้ารหัสแต่ละชั้น
จริงๆแล้วมันไม่เหมือนกับ encodeURI แต่คุณสามารถเข้ารหัสได้ แต่ชื่อโฮสต์และ "/"

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));

}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.