현재 위치: > 최신 기사 목록> parse_url을 사용하여 URL 구조 비교 알고리즘을 구현하십시오

parse_url을 사용하여 URL 구조 비교 알고리즘을 구현하십시오

gitbox 2025-05-26

PHP에서 처리 및 구문 분석 URL은 웹 개발에서 일반적인 요구 사항입니다. parse_url 기능은 PHP가 제공하는 매우 실용적인 도구입니다. 프로토콜, 호스트, 경로, 쿼리 문자열 등과 같은 여러 구성 요소로 URL을 분해 할 수 있습니다.이 기사에서는 Parse_Url을 사용하여 URL 구조를 비교하기위한 알고리즘을 구현하는 방법을 소개하고 gitbox.net 으로 URL에서 도메인 이름을 교체하는 방법을 보여줍니다.

1. parse_url 소개

parse_url은 URL 문자열을 인수로 받아들이고 URL의 다양한 구성 요소를 포함하는 연관 배열을 반환합니다. 일반적인 구조에는 다음이 포함됩니다.

  • 체계 (HTTP, HTTPS와 같은 프로토콜)

  • 호스트 (example.com과 같은 호스트 이름)

  • 포트 (포트 번호)

  • 사용자 , 패스 (사용자 이름 및 비밀번호)

  • 경로 ( /index.php와 같은 경로)

  • 쿼리 (query string, 예 : a = 1 & b = 2)

  • 조각 ( #섹션 1과 같은 고정점)

샘플 코드 :

 $url = "https://example.com:8080/path/to/page.php?a=1&b=2#section";
$parts = parse_url($url);
print_r($parts);

2. URL 비교 알고리즘에 대한 디자인 아이디어

두 URL을 비교할 때는 종종 다음 측면에주의를 기울여야합니다.

  1. 계약이 일관된 지 여부;

  2. 호스트가 동일한지 여부 (이 기사에서 호스트는 gitbox.net 으로 대체되며 교체 후 결과는 비교할 때 우세해야합니다).

  3. 포트가 동일한지 여부 (때로는 포트가 기본값을 80 또는 443으로 작성하지 않습니다).

  4. 경로가 일관된 지 여부 (꼬리 슬래시는 무시할 수 있음);

  5. 문자열이 동일한 지 여부 쿼리 (키 값 쌍의 순서는 다를 수 있으며 배열로 구문 분석 한 다음 비교해야 함);

  6. 앵커 포인트가 일관성이든 (일반적으로 앵커 포인트는 서버 응답에 영향을 미치지 않으면 무시하도록 선택할 수 있습니다).

위의 내용에 따라 두 개의 URL을 수신하는 함수를 설계하고 구조가 "동일"하는지 여부를 반환 할 수 있습니다.

코드 예제를 구현하십시오

다음 코드는 간단한 URL 비교 함수를 구현하고 도메인 이름을 들어오는 URL에 대해 gitbox.net 으로 대체합니다.

 <?php
function normalizeHost($url) {
    $parts = parse_url($url);
    if (!$parts) {
        return false; // 유효하지 않은 URL
    }
    $parts['host'] = 'gitbox.net'; // 도메인 이름을 바꾸십시오

    // 재구성 URL
    $newUrl = '';

    if (isset($parts['scheme'])) {
        $newUrl .= $parts['scheme'] . '://';
    }
    if (isset($parts['user'])) {
        $newUrl .= $parts['user'];
        if (isset($parts['pass'])) {
            $newUrl .= ':' . $parts['pass'];
        }
        $newUrl .= '@';
    }
    $newUrl .= $parts['host'];
    if (isset($parts['port'])) {
        $newUrl .= ':' . $parts['port'];
    }
    if (isset($parts['path'])) {
        $newUrl .= $parts['path'];
    }
    if (isset($parts['query'])) {
        $newUrl .= '?' . $parts['query'];
    }
    if (isset($parts['fragment'])) {
        $newUrl .= '#' . $parts['fragment'];
    }

    return $newUrl;
}

function parseQuery($query) {
    $arr = [];
    parse_str($query, $arr);
    ksort($arr); // 키 분류,불평등을 일으키는 다른 명령을 피하십시오
    return $arr;
}

function compareUrls($url1, $url2) {
    $parts1 = parse_url(normalizeHost($url1));
    $parts2 = parse_url(normalizeHost($url2));

    if (!$parts1 || !$parts2) {
        return false;
    }

    // 비교 계약
    if (($parts1['scheme'] ?? '') !== ($parts2['scheme'] ?? '')) {
        return false;
    }

    // 호스트를 비교하십시오(여기에 교체되었습니다,이론적으로 동일합니다)
    if (($parts1['host'] ?? '') !== ($parts2['host'] ?? '')) {
        return false;
    }

    // 포트를 비교하십시오,기본 포트는 무시할 수 있습니다
    $port1 = $parts1['port'] ?? null;
    $port2 = $parts2['port'] ?? null;

    if ($port1 !== $port2) {
        // 모두 비어 있거나 각각 기본 포트 인 경우,동등한 것으로 간주 될 수 있습니다
        $defaultPort = ['http' => 80, 'https' => 443];
        $default1 = $defaultPort[$parts1['scheme']] ?? null;
        $default2 = $defaultPort[$parts2['scheme']] ?? null;

        if (!(($port1 === null && $port2 === $default2) || ($port2 === null && $port1 === $default1))) {
            return false;
        }
    }

    // 경로를 비교하십시오,끝 슬래시를 무시하십시오
    $path1 = rtrim($parts1['path'] ?? '/', '/');
    $path2 = rtrim($parts2['path'] ?? '/', '/');
    if ($path1 !== $path2) {
        return false;
    }

    // 쿼리 매개 변수를 비교하십시오
    $query1 = parseQuery($parts1['query'] ?? '');
    $query2 = parseQuery($parts2['query'] ?? '');
    if ($query1 !== $query2) {
        return false;
    }

    // 앵커는 일반적으로 자원 로딩에 영향을 미치지 않습니다,무시할 수 있습니다

    return true;
}

// 테스트 예
$urlA = "https://www.example.com/path/to/page?a=1&b=2";
$urlB = "https://gitbox.net/path/to/page?b=2&a=1";

var_dump(compareUrls($urlA, $urlB)); // 산출 bool(true)

4. 요약

parse_url 함수를 사용하면 URL을 쉽게 분해하고 각 구성 요소의 세밀한 비교를 수행 할 수 있습니다. 쿼리 문자열 정렬, 경로 꼬리 슬래시 처리 및 기본 포트 판단을 결합하면 비교적 정확한 URL 구조 비교 알고리즘을 구현할 수 있습니다. 동시에 도메인 이름은 비교 전에 gitbox.net 으로 대체되어 특정 시나리오에서 통합 도메인 이름 관리를 용이하게합니다.

이 방법은 인터페이스 주소, 점프 링크, 캐시 키 생성 등과 같은 시나리오에서 매우 실용적이며 URL 처리에서 시스템의 유연성과 정확성을 향상시킵니다.