programing

PHP 문자열이 다른 문자열로 끝나는지 여부를 확인하는 가장 효율적인 테스트는 무엇입니까?

kingscode 2023. 2. 1. 22:05
반응형

PHP 문자열이 다른 문자열로 끝나는지 여부를 확인하는 가장 효율적인 테스트는 무엇입니까?

문자열의 유무를 테스트하는 표준 PHP 방법$str서브스트링으로 끝나다$test다음과 같습니다.

$endsWith = substr( $str, -strlen( $test ) ) == $test

이게 가장 빠른 길인가요?

아사프가 말한 것은 옳다.PHP에는 이를 위한 기능이 내장되어 있습니다.

substr_compare($str, $test, strlen($str)-strlen($test), strlen($test)) === 0;

한다면$test보다 길다$strPHP에서 경고가 표시되므로 먼저 확인해야 합니다.

function endswith($string, $test) {
    $strlen = strlen($string);
    $testlen = strlen($test);
    if ($testlen > $strlen) return false;
    return substr_compare($string, $test, $strlen - $testlen, $testlen) === 0;
}

이 방법은 메모리 비용이 조금 더 들지만 속도가 더 빠릅니다.

stripos(strrev($haystack), $reversed_needle) === 0;

바늘이 무엇인지 정확히 알고 있을 때 가장 좋기 때문에 반대로 하드 코드화할 수 있습니다.Needle을 프로그래밍 방식으로 반전시키면 이전 방법보다 느려집니다.

편집 (12년) : LOL, 내가 실제로 무슨 말을 하는지 몰랐을 때 쓴 아주 오래된 답변입니다.나는 그때 이후로 내가 성장한 생각을 갖고 싶다.@DavidHarkness의 말이 맞습니다.네거티브 케이스에서는 그다지 효율적이지 않습니다.가능한 한 많은 성능을 필요로 한다면 역방향으로 반복하고 조기에 보석하는 것이 훨씬 빠를 것입니다.또, php가 이것을 실현하는 더 좋은 방법이 있을지도 모릅니다.솔직히 10년 가까이 php를 쓰지 않았기 때문에 이제 다른 사람에게 맡기겠습니다.

$endsWith = substr_compare( $str, $test, -strlen( $test ) ) === 0

음의 오프셋 "문자열 끝에서 카운트를 시작합니다."

다음 간단한 방법으로 문자열이 다른 문자열로 끝나는지 확인할 수 있습니다.strpos문자열을 찾을 수 있는 오프셋 오른쪽:

function stringEndsWith($whole, $end)
{
    return (strpos($whole, $end, strlen($whole) - strlen($end)) !== false);
}

간단하지만, PHP 4에서는 동작할 수 있을 것 같습니다.

어떤 종류의 효율에 관심이 있느냐에 따라 다릅니다.

사용 중인 버전은 기판 사용 시 추가 복사를 통해 더 많은 메모리를 사용합니다.

대체 버전에서는 복사본을 작성하지 않고 원본 문자열에서 하위 문자열이 마지막으로 검색될 수 있지만 테스트 횟수가 더 많기 때문에 속도가 느려질 수 있습니다.

아마도 가장 효율적인 방법은 -sterlen(test) 위치에서 문자열 끝까지 char-by-char 루프를 실행하여 비교하는 것입니다.이것은 최소한의 비교이며, 여분의 메모리는 거의 사용되지 않습니다.

PHP 8의 경우:

str_ends_with('haystack', 'stack'); // true
str_ends_with('haystack', 'K'); // false

또, 다음과 같은 것도 있습니다.

str_starts_with('haystack', 'hay'); // true

PHP RFC: str_starts_with(), str_ends_with() 및 관련 함수를 추가합니다.

다른 방법으로는 다음 기능을 사용할 수 있습니다.

strrpos($str, $test) == strlen($str) - strlen($test)

하지만 그건 빠르지 않아요.

다음 답변이 효율적이고 간단하기를 바랍니다.

$content = "The main string to search";
$search = "search";
//For compare the begining string with case insensitive. 
if(stripos($content, $search) === 0) echo 'Yes';
else echo 'No';

//For compare the begining string with case sensitive. 
if(strpos($content, $search) === 0) echo 'Yes';
else echo 'No';

//For compare the ending string with case insensitive. 
if(stripos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';

//For compare the ending string with case sensitive. 
if(strpos(strrev($content), strrev($search)) === 0) echo 'Yes';
else echo 'No';

이것이 빠른지 아닌지는 모르지만, 1개의 문자 테스트에서도, 다음과 같이 동작합니다.

(array_pop(str_split($string)) === $test) ? true : false;
($string[strlen($string)-1] === $test) ? true : false;
(strrev($string)[0] === $test) ? true : false;

정규 표현으로 확인하는 가장 쉬운 방법

를 들어, 제공된 메일이 gmail인지 확인하려면:

echo (preg_match("/@gmail\.com$/","example-email@gmail.com"))?'true':'false';

strchr()와 같은 역함수가 문자열의 끝에 가장 빨리 일치시킬 수 있다고 생각합니다.

이것은 strlen을 제외하고 외부 함수를 호출하지 않는 순수한 PHP입니다.

function endsWith ($ends, $string)
{
    $strLength = strlen ($string);
    $endsLength = strlen ($ends);
    for ($i = 0; $i < $endsLength; $i++)
    {
        if ($string [$strLength - $i - 1] !== $ends [$i])
            return false;
    }
    return true;
}

싱글차 니들의 경우:

if (@strrev($haystack)[0] == $needle) {
   // yes, it ends...
}

언급URL : https://stackoverflow.com/questions/619610/whats-the-most-efficient-test-of-whether-a-php-string-ends-with-another-string

반응형