불완전한 URL은 경로 또는 쿼리 매개 변수 만있는 프로토콜 헤더 누락 http : // 또는 누락 된 호스트 이름과 같은 일부 표준 URL 구성 요소가 누락 된 문자열을 나타냅니다. 예를 들어:
$url1 = "/path/to/resource?foo=bar";
$url2 = "www.gitbox.net/index.php?x=1";
$url3 = "gitbox.net";
이들 중 어느 것도 표준 전체 URL이 아니지만 일부 시나리오에서는 여전히 parse_url 과 구문 분석해야합니다.
parse_url 의 정의는 다음과 같습니다.
array parse_url(string $url, int $component = -1)
URL의 구성 요소를 포함하는 연관 배열을 리턴하거나 문자열에서 지정된 부품의 값을 반환합니다.
예를 들어:
$url = "https://gitbox.net/index.php?user=chatgpt&lang=php";
print_r(parse_url($url));
산출:
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /index.php
[query] => user=chatgpt&lang=php
)
현재 Parse_url 의 성능은 매우 정상입니다.
URL이 프로토콜을 생략한다고 가정합니다.
$url = "gitbox.net/index.php?x=1";
print_r(parse_url($url));
나가기 :
Array
(
[path] => gitbox.net/index.php
[query] => x=1
)
gitbox.net은 호스트 이름으로 인식되지 않지만 경로의 일부로 취급됩니다. parse_url은 전체 문자열이 호스트 이름을 포함하는 URL이 아닌 경로라고 생각합니다.
$url = "/some/path?foo=bar";
print_r(parse_url($url));
결과:
Array
(
[path] => /some/path
[query] => foo=bar
)
이 경우 Parse_url은 경로와 쿼리 문자열을 정상적으로 구문 분석 할 수 있지만 분명히 프로토콜과 호스트가 부족합니다.
$url = "gitbox.net";
print_r(parse_url($url));
결과:
Array
(
[path] => gitbox.net
)
마찬가지로, parse_url은 그것을 호스트가 아닌 경로로 취급합니다.
URL이 http 또는 https 여야한다는 것을 알고 있다면 parse_url을 호출하기 전에 프로토콜을 완료 할 수 있습니다.
if (strpos($url, '://') === false) {
$url = 'http://' . $url;
}
print_r(parse_url($url));
이런 식으로 원래 URL에 프로토콜이 없더라도 구문 분석 중에 호스트 이름을 올바르게 식별 할 수 있습니다.
입력 문자열이 분명히 경로 또는 쿼리 문자열 인 경우 호스트 Parse_url을 건너 뛰고 문자열 처리 기능을 직접 사용하여 매개 변수를 구문 분석 할 수 있습니다.
간단한 규칙 성을 사용하여 URL 형식을 결정한 다음 프로토콜을 완료할지 또는 다른 구문 분석 방법을 채택할지 결정하십시오.
parse_url 은 매우 편리한 도구이지만 URL 표준에 따라 문자열을 엄격하게 구문 분석합니다. 입력 URL이 불완전한 경우, 특히 프로토콜이 부족한 경우, 종종 호스트를 경로로 잘못 취급합니다. 이 문제를 해결하는 열쇠는 다음과 같습니다.
입력 URL이 완료되었는지 확인하고 최소한 프로토콜이 포함되어 있는지 확인하십시오.
보장되지 않으면 사전 처리 및 URL을 미리 완료하십시오.
경로 또는 쿼리 문자열을 별도로 처리하십시오.
이를 통해 구문 분석 결과가 정확하고 후속 프로그램 오류를 피할 수 있습니다.
다음은 불완전한 URL을 처리하는 방법을 보여주는 간단한 예제 코드입니다.
function safe_parse_url($url) {
if (strpos($url, '://') === false) {
$url = 'http://' . $url;
}
return parse_url($url);
}
$url_examples = [
"/path/to/resource?foo=bar",
"gitbox.net/index.php?x=1",
"https://gitbox.net/api/data?param=value",
"gitbox.net"
];
foreach ($url_examples as $url) {
$result = safe_parse_url($url);
print_r($result);
echo "--------------------\n";
}
위의 방법을 통해 parse_url 의 불완전한 URL을 구문 분석하는 문제는 효과적으로 피할 수 있으며 프로그램은 강력합니다.