[php] 문자열의 시작 부분에서 문자열을 제거

다음과 같은 문자열이 있습니다.

$str = "bla_string_bla_bla_bla";

첫 번째를 어떻게 제거 할 수 있습니까 bla_? 그러나 문자열의 시작 부분에서 발견되는 경우에만?

를 사용 str_replace()하면의 모든 항목 이 제거 됩니다bla_ .



답변

정규식이없는 일반 형식 :

$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';

if (substr($str, 0, strlen($prefix)) == $prefix) {
    $str = substr($str, strlen($prefix));
} 

소요 : 0.0369ms (0.000,036,954 초)

그리고

$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);

소요 : 0.1749 MS (0.000,174,999 초) (컴파일) 1 차 실행하고, 0.0510 MS (0.000,051,021 초) 후를.

분명히 내 서버에 프로파일 링되었습니다.


답변

캐럿 기호 ( ^) 와 함께 정규 표현식을 사용 하여 일치를 문자열의 시작 부분에 고정 시킬 수 있습니다 .

$str = preg_replace('/^bla_/', '', $str);


답변

function remove_prefix($text, $prefix) {
    if(0 === strpos($text, $prefix))
        $text = substr($text, strlen($prefix)).'';
    return $text;
}


답변

여기.

$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);


답변

substr_replace는 문자열의 일부로 바꾸기를 제한 할 수있는 곳에서 원하는 것을 수행한다고 생각합니다.
http://nl3.php.net/manual/en/function.substr-replace.php (이것은 오직 문자열의 시작)

str_replace의 count 매개 변수 ( http://nl3.php.net/manual/en/function.str-replace.php )를 사용할 수 있습니다. 이렇게하면 왼쪽부터 시작하여 교체 횟수를 제한 할 수 있습니다. 처음에 강요하지 않습니다.


답변

속도는 좋지만 _로 끝나는 바늘에 따라 하드 코딩됩니다. 일반 버전이 있습니까? – toddmo 6 월 29 일 23:26

일반적인 버전 :

$parts = explode($start, $full, 2);
if ($parts[0] === '') {
    $end = $parts[1];
} else {
    $fail = true;
}

일부 벤치 마크 :

<?php

$iters = 100000;
$start = "/aaaaaaa/bbbbbbbbbb";
$full = "/aaaaaaa/bbbbbbbbbb/cccccccccc/dddddddddd/eeeeeeeeee";
$end = '';

$fail = false;

$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
    if (strpos($full, $start) === 0) {
        $end = substr($full, strlen($start));
    } else {
        $fail = true;
    }
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "strpos+strlen", $t);

$t0 = microtime(true);
for ($i = 0; $i < $iters; $i++) {
    $parts = explode($start, $full, 2);
    if ($parts[0] === '') {
        $end = $parts[1];
    } else {
        $fail = true;
    }
}
$t = microtime(true) - $t0;
printf("%16s : %f s\n", "explode", $t);

내 아주 오래된 집 PC에서 :

$ php bench.php

출력 :

   strpos+strlen : 0.158388 s
         explode : 0.126772 s


답변

더 빠른 접근 방식은 다음과 같습니다.

// strpos is faster than an unnecessary substr() and is built just for that 
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));