จะแก้ไขเส้นทางที่สัมพันธ์กับเส้นทางอื่นได้อย่างน่าเชื่อถือได้อย่างไร

ใน PHP มีวิธีในตัวในการแก้ไขเส้นทางที่สัมพันธ์กับเส้นทางอื่นหรือไม่

ตัวอย่างเช่น เมื่อกำหนด $baseDir dir: /home/ben/project แล้ว $path ต่อไปนี้ควรแก้ไขเป็น:

  • /foo/bar/foo/bar
  • ../foo/bar, → /home/ben/foo/bar

โซลูชั่นที่อยู่ในใจ:

  • การเปลี่ยนแปลงไดเร็กทอรีการทำงานปัจจุบันชั่วคราว และใช้ realpath():

    $currentDir = getcwd();
    chdir($baseDir);
    $resolvedPath = realpath($path);
    chdir($currentDir);
    
    return $resolvedPath;
    

    วิธีแก้ปัญหานี้ค่อนข้างน่าเบื่อ

  • ตรวจสอบว่าเส้นทางเป็นค่าสัมบูรณ์หรือไม่ หากไม่ใช่ ให้ใช้ realpath():

    if ($path[0] === '/') {
        return $path;
    }
    
    return realpath($currentDir . '/' . $path);
    

    โซลูชันนี้ไม่ใช่ข้ามแพลตฟอร์ม การทำให้ข้ามแพลตฟอร์มได้อย่างปลอดภัยอาจไม่เป็นเรื่องเล็กน้อยอย่างที่คิด

สุดท้ายแต่ไม่ท้ายสุด realpath() ส่งคืน false เมื่อไม่มีเส้นทาง ซึ่งไม่ได้นำมาพิจารณาในโค้ดข้างต้น และอาจเกิดปัญหาในบางกรณีการใช้งาน

ฉันพลาดอะไรไปหรือเปล่า?


person BenMorel    schedule 01.08.2019    source แหล่งที่มา
comment
ทำไมคุณถึงคิดว่าโซลูชันที่สองของคุณไม่ใช่ข้ามแพลตฟอร์ม   -  person Giacomo M    schedule 01.08.2019
comment
@GiacomoM เพราะบน Windows เส้นทางอาจเริ่มต้นด้วย C:\ ไม่ใช่ / และฉันไม่แน่ใจเกี่ยวกับระบบปฏิบัติการอื่น ๆ   -  person BenMorel    schedule 01.08.2019
comment
PHP มี DIRECTORY_SEPARATOR คงที่ซึ่งเป็นข้ามแพลตฟอร์ม   -  person Giacomo M    schedule 01.08.2019
comment
ตัวคั่นไดเร็กทอรีไม่ใช่ปัญหา / ก็ทำงานบน Windows ได้เช่นกัน ปัญหาคือการตรวจสอบที่เชื่อถือได้ว่าเส้นทางเป็นแบบสัมบูรณ์หรือแบบสัมพัทธ์   -  person BenMorel    schedule 01.08.2019
comment
ยังไม่เข้าใจว่าเหตุใดคุณจึงคิดว่าไม่ใช่ข้ามแพลตฟอร์ม   -  person Giacomo M    schedule 01.08.2019
comment
หากต้องการตรวจสอบว่าเส้นทางเป็นแบบสัมบูรณ์หรือแบบสัมพัทธ์ให้ตรวจสอบโพสต์นี้ stackoverflow.com/questions/7392274/   -  person Giacomo M    schedule 01.08.2019