[php] PHP 문자열이 다른 문자열로 끝나는 지 여부에 대한 가장 효율적인 테스트는 무엇입니까?

$str문자열 $test이 부분 문자열로 끝나는 지 여부를 테스트하는 표준 PHP 방법 은 다음 과 같습니다.

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

이것이 가장 빠른 방법입니까?



답변

Assaf의 말이 맞습니다. 이를 정확히 수행하기 위해 PHP에 내장 된 함수가 있습니다.

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

경우 $test더 이상보다 $str당신이 먼저 확인해야하므로, 경고를 줄 것이다 PHP.

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;

바늘이 무엇인지 정확히 알고있는 경우에 가장 적합하므로 반대로 하드 코딩 할 수 있습니다. 프로그래밍 방식으로 바늘을 뒤집 으면 이전 방법보다 느려집니다.


답변

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

음수 오프셋 “문자열 끝부터 계산 시작”.


답변

다음 strpos은 문자열을 찾을 위치에 오프셋 을 제공 하여 한 문자열이 다른 문자열로 끝나는 지 확인하는 간단한 방법입니다 .

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

간단하고 PHP 4에서 작동한다고 생각합니다.


답변

어떤 종류의 효율성에 관심이 있는지에 따라 다릅니다.

귀하의 버전은 substr 사용으로 인한 추가 사본으로 인해 더 많은 메모리를 사용합니다.

대체 버전은 복사본을 만들지 않고 원래 문자열에서 하위 문자열의 마지막 발생을 검색 할 수 있지만 더 많은 테스트로 인해 속도가 느려질 수 있습니다.

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


답변

또 다른 방법은 strrpos함수 를 사용하는 것입니다 .

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';