분류 php

PHP 8.0 : substr 및 iconv_substr이 경계를 벗어난 오프셋에 대해 빈 문자열을 반환합니다.

컨텐츠 정보

  • 조회 508 (작성일 )

본문

PHP의 substr, mb_substr, iconv_substr 및 graphme_substr 함수는 제공된 문자열의 일부를 검색하는 방법을 제공합니다.


PHP 8 이전에는 오프셋 매개 변수가 제공된 문자열 자체보다 길면 부울 false를 반환했습니다. 이것은 반환 유형으로 문자열을 언급 한 문서화 된 함수 서명을 위반했습니다.


예를 들어 PHP 8 이전에는 다음 코드 조각이 이러한 함수에 대해 false를 반환합니다.


substr('FooBar', 42, 3); // false
mb_substr('FooBar', 42, 3); // ""
iconv_substr('FooBar', 42, 3); // false
grapheme_substr('FooBar', 42, 3); // false


위의 스니펫에서 문자열 오프셋 매개 변수는 42이지만 문자열 자체는 6 자입니다. 다른 확장의 substr 및 보완 함수 (mb_string 제외)는 false를 반환합니다.


PHP 8에서는 이러한 함수의 동작이 변경되었습니다.


substr 


substr은 오프셋이 문자열 길이보다 크면 빈 문자열을 반환합니다. PHP 8 이전에는 false를 반환했습니다.


substr('FooBar', 42); // ""


mb_substr 


mb_substr은 모든 PHP 버전에서 이미 빈 문자열을 반환하며 PHP 8.0에서는 변경되지 않습니다.


iconv_substr 


iconv_substr은 오프셋이 제공된 문자열의 길이보다 큰 경우 false를 반환합니다. 이것은 PHP 8에서 빈 문자열을 반환하도록 변경되었습니다.


iconv_substr('FooBar', 42); // ""

음수 문자열 오프셋에서 iconv_substr 함수는 오프셋을 문자열 길이로 고정합니다.


iconv_substr('FooBar', -42, 4); // "FooB"

grapheme_substr 


grapheme_substr은 오프셋이 문자열 길이보다 크면 빈 문자열을 반환합니다. PHP 8 이전에는 substr과 유사한 false를 반환했습니다.


grapheme_substr('FooBar', 42); // ""

이것은 이제 다음 모든 함수에 적용됩니다.


substr('FooBar', 42, 3); // ""
mb_substr('FooBar', 42, 3); // ""
iconv_substr('FooBar', 42, 3); // ""
grapheme_substr('FooBar', 42, 3); // ""


오프셋 매개 변수는 음수 문자열 일 수 있으며, 이는 substr이 제공된 문자열의 끝에서 계산 된 문자열의 일부를 반환하도록 합니다. 음수 문자열 오프셋이 문자열 길이를 초과하면 커서가 그 길이를 넘지 않습니다. 이 기능은 substr 및 mb_substr 함수에 대해 변경되지 않았습니다.


iconv_substr 및 grapheme_substr 함수는 이제 substr 및 iconv_substr 함수 다음에 음의 오프셋을 문자열 길이로 고정합니다.



                                                                 PHP < 8.0

PHP >= 8.0
substr('FooBar', 42)false""
substr('FooBar', -42, 4)"FooB""FooB"
mb_substr('FooBar', 42)""""
mb_substr('FooBar', -42, 4)"FooB""FooB"
iconv_substr('FooBar', 42)false""
iconv_substr('FooBar', -42, 4)false"FooB"
grapheme_substr('FooBar', 42)false""
grapheme_substr('FooBar', -42, 4)false"FooB"


이전 버전과의 호환성 영향 


substr 및 iconv_substr 함수의 반환 유형은 이제 이전 string | false에서 문자열이 되며 mb_substr 함수와 일치합니다.


이러한 함수가 false로 값을 반환하는 데 의존하는 경우 이제 대신 빈 문자열 ( "")을 반환합니다. 이는 의미 상 더 정확한 동작입니다.


이 변경은 PHP 8.0 베타 4 (최종 베타)가 출시 된 이후에 이루어졌습니다. GA (일반 공급) 버전을 포함하여 PHP 8.0 버전 RC1 이상에서만 유효합니다. RC1 이전의 PHP 8.0 버전에서 grapheme_substr 함수는 유효하지 않은 오프셋에서 ValueError 예외를 던지도록 설정되었습니다. 


https://php.watch/versions/8.0/substr-out-of-bounds