ProgramingTip

PHP에서 이미 "_"로 시작하는지 확인하는 방법은 무엇입니까?

bestdevel 2021. 1. 8. 23:07
반응형

PHP에서 이미 "_"로 시작하는지 확인하는 방법은 무엇입니까?


이 질문에 이미 답변이 있습니다.

예 : 나는 $variable = "_foo"$ 변수가 밑줄로 시작하지 않도록 확실히하고 싶습니다 "_". PHP에서 어떻게 할 수 있습니까? 더 많은 뒤의 문자 배열에 대한 액세스가 있습니까?


substrPHP 에서 함수를 확인하고 그런 식으로 첫 번째 문자를 잡을 수 있습니다 .

http://php.net/manual/en/function.substr.php

if (substr('_abcdef', 0, 1) === '_') { ... }

$variable[0] != "_"

어떻게 작동합니까?

PHP에서는 배열 표기법으로 특정 문자를 사용할 수 있습니다. $variable[0]대부분의 첫 번째 문자입니다 ($ 변수가있는 경우).


많은 효율성을 가지고 있었으므로 지금까지 호기심에서 주어진 기능을 벤치마킹했습니다.

function startsWith1($str, $char) {
    return strpos($str, $char) === 0;
}
function startsWith2($str, $char) {
    return stripos($str, $char) === 0;
}
function startsWith3($str, $char) {
    return substr($str, 0, 1) === $char;
}
function startsWith4($str, $char){
    return $str[0] === $char;
}
function startsWith5($str, $char){
    return (bool) preg_match('/^' . $char . '/', $str);
}
function startsWith6($str, $char) {
    if (is_null($encoding)) $encoding = mb_internal_encoding();
    return mb_substr($str, 0, mb_strlen($char, $encoding), $encoding) === $char;
}

다음은 각각 100.000 실행되는 평균 DualCore 컴퓨터의 결과입니다.

// Testing '_string'
startsWith1 took 0.385906934738
startsWith2 took 0.457293987274
startsWith3 took 0.412894964218
startsWith4 took 0.366240024567 <-- fastest
startsWith5 took 0.642996072769
startsWith6 took 1.39859509468

// Tested "string"
startsWith1 took 0.384965896606
startsWith2 took 0.445554971695
startsWith3 took 0.42377281189
startsWith4 took 0.373164176941 <-- fastest
startsWith5 took 0.630424022675
startsWith6 took 1.40699005127

// Tested 1000 char random string [a-z0-9]
startsWith1 took 0.430691003799
startsWith2 took 4.447286129
startsWith3 took 0.413349866867
startsWith4 took 0.368592977524 <-- fastest
startsWith5 took 0.627470016479
startsWith6 took 1.40957403183

// Tested 1000 char random string [a-z0-9] with '_' prefix
startsWith1 took 0.384054899216
startsWith2 took 4.41522812843
startsWith3 took 0.408898115158
startsWith4 took 0.363884925842 <-- fastest
startsWith5 took 0.638479948044
startsWith6 took 1.41304707527

보시다시피 건초 더미를 배열로 처리하여 첫 번째 위치의 문자를 찾는 것이 항상 가장 빠른 솔루션입니다. 또한 동일한 길이에 관계없이 동일한 속도로 수행됩니다. 사용 strpossubstr짧은 문자열 보다 빠르지 만 문자열이 접두어로 시작하지 않는 긴 문자열의 경우 더 느립니다. 하지만 그 차이는 무관합니다. 긴 어깨 stripos엄청나게 느립니다. preg_match거의 동일하게 수행되는 수행 속도는 평범합니다. mb_substr솔루션 최악의 수행, 아마 더 많은 수있는 생각하면서.

이 숫자는 100.000 실행에 대한 것이므로 호출 당 0.0000x 초에 대해 말하는 것이 분명합니다. 효율성 을 위해 다른 하나를 선택 하는 것은 앱이 startsWith생계를 확인 하지 않는 한 쓸모없는 마이크로 최적화 입니다.


이것은 성능에 대해 걱정하지 않는 가장 간단한 대답입니다.

if (strpos($string, '_') === 0) {
    # code
}

strpos가 반환 0하면 찾고 있던 내용이 0문자열의 시작 인 character 에서 시작한다는 의미입니다 .

여기에 자세히 설명되어 있습니다. http://uk3.php.net/manual/en/function.strpos.php

(PS $string[0] === '_'가 베스트 답변)


function starts_with($s, $prefix){
    // returns a bool
    return strpos($s, $prefix) === 0;
}

starts_with($variable, "_");

함수로 시작 하는 것이 더 좋습니다 .

function mb_startsWith($str, $prefix, $encoding=null) {
    if (is_null($encoding)) $encoding = mb_internal_encoding();
    return mb_substr($str, 0, mb_strlen($prefix, $encoding), $encoding) === $prefix;
}

pinusnegra의 답변을 구축하고 해당 답변에 대한 Gumbo의 의견에 대한 응답으로 :

function has_leading_underscore($string) {

    return $string[0] === '_';

}

PHP 5.3.0에서 실행하면 문자열 길이가 1 자 이상인지 확인하지 않아도 다음이 작동하고 예상 값을 반환합니다.

echo has_leading_underscore('_somestring').', ';
echo has_leading_underscore('somestring').', ';
echo has_leading_underscore('').', ';
echo has_leading_underscore(null).', ';
echo has_leading_underscore(false).', ';
echo has_leading_underscore(0).', ';
echo has_leading_underscore(array('_foo', 'bar'));

/*
 * output: true, false, false, false, false, false, false
 */

다른 버전의 PHP가 어떻게 반응할지 모르겠지만 모두 작동한다면이 방법은 아마도 substr 경로보다 더 효율적일 것입니다.

참조 URL : https://stackoverflow.com/questions/1962031/how-to-check-if-a-string-starts-with-in-php

반응형