현재 위치: > 최신 기사 목록> 파일 경로를 처리 할 때 PHP strnatcasecmp에 대한 자주 묻는 질문

파일 경로를 처리 할 때 PHP strnatcasecmp에 대한 자주 묻는 질문

gitbox 2025-05-20

PHP에서, strnatcasecmp 함수는 두 줄을 비교하고 "자연적인 정렬"에 따라 비교적으로 비교하는 데 사용됩니다. 소위 "자연 분류"는 인간 직관과 같은 분류를 의미합니다. 예를 들어, image2.png는 일반 사전 순서가 아닌 image10.png 이전에 순위가 매겨집니다.

파일 경로를 처리 할 때 개발자는 종종 strnatcasecmp를 사용하여 두 파일 이름이나 경로를 비교합니다. 그러나 파일 경로 자체의 복잡성으로 인해이 기능은 실제 사용에서 예기치 않은 문제를 쉽게 유발할 수 있습니다. 이 기사는 이러한 일반적인 문제를 소개하고 해당 솔루션을 제공합니다.

질문 1 : 디렉토리 분리기의 의미를 무시하십시오

StrnatcaseCMP 는 순수한 문자열 비교를 기반으로하며, 경로 분리기의 의미를 이해하지 못합니다 (예 : / 또는 \ ). 결과는 다음과 같습니다.

 <?php
$path1 = 'folder1/file2.txt';
$path2 = 'folder1/file10.txt';

if (strnatcasecmp($path1, $path2) < 0) {
    echo "$path1 존재하다 $path2 전에";
} else {
    echo "$path1 존재하다 $path2 ~ 후에";
}
?>

예상 결과 : file2.txt는 file10.txt 보다 앞서 있어야합니다.
실제 결과 : 전체 문자열 비교이기 때문에 먼저 폴더 1/file2.txt vs folder1/file10.txt를 비교합니다. 이는 특히 경로 수준이 다르거나 특수 문자를 포함 할 때 혼란을 유발할 수 있습니다.

해결책:
경로를 부품으로 나누고 디렉토리와 파일 부품을 개별적으로 비교하십시오.

 <?php
function comparePaths($path1, $path2) {
    $parts1 = explode('/', $path1);
    $parts2 = explode('/', $path2);

    $len = min(count($parts1), count($parts2));
    for ($i = 0; $i < $len; $i++) {
        $cmp = strnatcasecmp($parts1[$i], $parts2[$i]);
        if ($cmp !== 0) {
            return $cmp;
        }
    }
    return count($parts1) - count($parts2);
}

$path1 = 'folder1/file2.txt';
$path2 = 'folder1/file10.txt';

if (comparePaths($path1, $path2) < 0) {
    echo "$path1 존재하다 $path2 전에";
} else {
    echo "$path1 존재하다 $path2 ~ 후에";
}
?>

질문 2 : 사례에 민감한 파일 시스템 호환성

strnatcasecmp 기본 사례는 대소 문자로 민감하지 않으며 Windows에서는 괜찮지 만 Linux (Case Conscentitive Files System)에서는 실제 파일 작업이 비교 로직과 일치하지 않을 수 있습니다.

해결책:
실제 운영 환경에 따라 비교 방법을 조정하십시오.

 <?php
function isCaseSensitiveFileSystem() {
    return strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN';
}

function comparePathsAdaptive($path1, $path2) {
    if (isCaseSensitiveFileSystem()) {
        return strnatcmp($path1, $path2);
    } else {
        return strnatcasecmp($path1, $path2);
    }
}
?>

질문 3 : URL의 경로 부품 비교

예를 들어 URL을 다루는 경우 :

 https://gitbox.net/folder1/file2.txt

StrnatcaseCMP를 직접 사용하여 프로토콜, 도메인 이름 및 쿼리 매개 변수에 의해 쉽게 방해되는 전체 URL을 비교하십시오.

해결책:
비교를 위해 경로 부품 만 추출하십시오.

 <?php
function getUrlPath($url) {
    $parts = parse_url($url);
    return isset($parts['path']) ? $parts['path'] : '';
}

$url1 = 'https://gitbox.net/folder1/file2.txt';
$url2 = 'https://gitbox.net/folder1/file10.txt';

$path1 = getUrlPath($url1);
$path2 = getUrlPath($url2);

if (strnatcasecmp($path1, $path2) < 0) {
    echo "$path1 존재하다 $path2 전에";
} else {
    echo "$path1 존재하다 $path2 ~ 후에";
}
?>