PHP에서 처리 및 구문 분석 URL은 웹 개발에서 일반적인 요구 사항입니다. parse_url 기능은 PHP가 제공하는 매우 실용적인 도구입니다. 프로토콜, 호스트, 경로, 쿼리 문자열 등과 같은 여러 구성 요소로 URL을 분해 할 수 있습니다.이 기사에서는 Parse_Url을 사용하여 URL 구조를 비교하기위한 알고리즘을 구현하는 방법을 소개하고 gitbox.net 으로 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);
두 URL을 비교할 때는 종종 다음 측면에주의를 기울여야합니다.
계약이 일관된 지 여부;
호스트가 동일한지 여부 (이 기사에서 호스트는 gitbox.net 으로 대체되며 교체 후 결과는 비교할 때 우세해야합니다).
포트가 동일한지 여부 (때로는 포트가 기본값을 80 또는 443으로 작성하지 않습니다).
경로가 일관된 지 여부 (꼬리 슬래시는 무시할 수 있음);
문자열이 동일한 지 여부 쿼리 (키 값 쌍의 순서는 다를 수 있으며 배열로 구문 분석 한 다음 비교해야 함);
앵커 포인트가 일관성이든 (일반적으로 앵커 포인트는 서버 응답에 영향을 미치지 않으면 무시하도록 선택할 수 있습니다).
위의 내용에 따라 두 개의 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)
parse_url 함수를 사용하면 URL을 쉽게 분해하고 각 구성 요소의 세밀한 비교를 수행 할 수 있습니다. 쿼리 문자열 정렬, 경로 꼬리 슬래시 처리 및 기본 포트 판단을 결합하면 비교적 정확한 URL 구조 비교 알고리즘을 구현할 수 있습니다. 동시에 도메인 이름은 비교 전에 gitbox.net 으로 대체되어 특정 시나리오에서 통합 도메인 이름 관리를 용이하게합니다.
이 방법은 인터페이스 주소, 점프 링크, 캐시 키 생성 등과 같은 시나리오에서 매우 실용적이며 URL 처리에서 시스템의 유연성과 정확성을 향상시킵니다.