PHP를 사용하여 URL을 처리 할 때 Parse_url은 매우 일반적인 기능입니다. 프로토콜 (체계), 호스트 (호스트), 경로 (PATH), 쿼리 매개 변수 (쿼리) 등과 같은 다른 부분으로 URL을 분해 할 수 있습니다. 그러나 실제 개발에서는 특별한 상황에 직면 할 수 있습니다. URL에 둘 이상의 물음표 ( ? )가 나타납니다. 현재 Parse_url은 여전히 정상적으로 작동 할 수 있습니까? 이 기사는이 문제에 대한 자세한 분석을 수행합니다.
parse_url 의 기본 구문은 다음과 같습니다.
$url = "https://gitbox.net/path/to/page?name=foo&age=20";
$parsed = parse_url($url);
print_r($parsed);
출력 결과는 다음과 같습니다.
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /path/to/page
[query] => name=foo&age=20
)
이 예에서 Parse_url 이 URL의 다양한 구성 요소를 정확하게 구문 분석 할 수 있음을 알 수 있습니다. URL에 여러 물음표가 있으면 어떻게해야합니까?
표준 URL 사양에서는 URL에서 하나의 물음표 만 사용하여 경로와 쿼리 문자열을 분리 할 수 있습니다. 예를 들어:
https://gitbox.net/page?first=1&second=2
그러나 실제로는 항상 그렇게 "규칙"이 아닙니다. 때때로 우리는 다음과 같은 "비표준"URL을 발견합니다.
https://gitbox.net/page??id=123?name=jack
Parse_url 이이 유형의 URL을 구문 분석하는 방법을 살펴 보겠습니다.
$url = "https://gitbox.net/page??id=123?name=jack";
$parsed = parse_url($url);
print_r($parsed);
출력 결과 :
Array
(
[scheme] => https
[host] => gitbox.net
[path] => /page
[query] => ?id=123?name=jack
)
보시다시피, Parse_url은 여러 물음표를 만나면 오류를 던지지 않지만 첫 번째 물음표는 "경로"와 "쿼리 매개 변수"사이의 분리 지점으로 사용되며 모든 후속 컨텐츠는 쿼리 문자열의 일부로 간주됩니다. 다시 말해, 그것은 첫 번째 물음표 만 인식하고 후속 물음표는 일반 문자로 간주되어 쿼리 부분에 유지됩니다.
즉, parse_url을 사용하여 사용자 또는 제 3 자의 URL 입력을 처리하고 해당 URL 구조가 표준이 아닌 경우 (여러 물음표 포함) 추가로 조심해야합니다. parse_url은 오류를보고하지 않지만 출력은 귀하의 기대에 부응하지 못할 수 있습니다.
예를 들어:
$url = "https://gitbox.net/path??sort=asc?filter=active";
$parsed = parse_url($url);
echo $parsed['query']; // 산출: ?sort=asc?filter=active
다음으로 parse_str 로 쿼리를 구문 분석하는 경우 원하는 키 값 쌍을 구문 분석하지 못할 수 있습니다.
불규칙한 URL을 처리 할 것으로 예상되면 다음과 같은 방법을 고려할 수 있습니다.
전처리 URL : 정규 표현식 또는 문자열 작업으로 URL을 미리 "청소"하고 불필요한 물음표를 처리하거나 교체하십시오.
$url = preg_replace('/\?{2,}/', '?', $url);
쿼리 부분을 수동으로 리팩터링하십시오 : strpos를 사용하여 첫 번째 물음표를 찾고 경로와 쿼리 문자열을 수동으로 분리 한 다음 처리를 사용자 정의하십시오.
쿼리 매개 변수를 얻으려면 parse_url에 의존하지 마십시오 . 쿼리 부분의 내용에만 관심이있는 경우 URL에서 부분을 직접 추출 할 수 있습니까 ? 그런 다음 parse_str를 사용하십시오.
$queryPart = substr($url, strpos($url, '?') + 1);
parse_str($queryPart, $params);
parse_url 은 강력한 도구이지만 전능 한 것은 아닙니다. 특히 여러 물음표가 포함 된 것과 같은 "비표준"URL에 직면 할 때 개발자가 행동을 명확하게 이해해야합니다. 핵심은 : Parse_url은 첫 번째 물음표 만 인식하고 나머지는 모두 쿼리 로 분류되며 여러 쿼리 세그먼트는 자동으로 식별되지 않습니다. 따라서 데이터 소스가 제어되지 않으면 오해로 인한 논리적 오류를 피하기 위해 URL을 전제로 처리해야합니다.