답변:
정규식이없는 일반 형식 :
$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 초) 후를.
분명히 내 서버에 프로파일 링되었습니다.
if(condition) { statement }
것이 훨씬 명확했을 것이다.
if (substr($str, 0, strlen($prefix)) == $prefix)
변경 가능 if (0 === strpos($str, $prefix))
동일한 판독성 : 유지하면서 불필요한 메모리 할당을 피하기 위해
캐럿 기호 ( ^
) 와 함께 정규 표현식을 사용 하여 일치를 문자열의 시작 부분에 고정 시킬 수 있습니다 .
$str = preg_replace('/^bla_/', '', $str);
substr()
버전 보다 빨리 작동하는지 궁금합니다 ... 그렇다고 생각하고 적절한 답변으로 표시해야합니다.
preg_quote
'd
multibyte
악몽은 다른 솔루션의 또 다른 문제이지만 파일 인코딩이 올바른 경우에는 잘 작동합니다. 어쨌든, 그것은이 질문의 범위에 있어서는 안되므로 신경 쓰지 않을 것입니다.
substr
및 strpos
배열을 받아 들일 수 없습니다. 어레이를 다루면 성능이 크게 향상됩니다. 건배!
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
.''
필요하지 않습니다.
(substr($str, 0, strlen($prefix)) == $prefix)
허용 된 답변의 .37과 비슷했습니다.
여기.
$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 )를 사용할 수 있습니다. 이렇게하면 왼쪽부터 시작하여 교체 횟수를 제한 할 수 있습니다. 처음에 강요하지 않습니다.
substr_replace
제거하려는 접두사인지 또는 다른 문자인지에 관계없이 주어진 범위의 문자를 대체합니다. OP는 bla_
"문자열의 시작 부분에있는 경우에만" 를 제거하려고 합니다.
속도는 좋지만 _로 끝나는 바늘에 따라 하드 코딩됩니다. 일반 버전이 있습니까? – 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
이렇게하면 시작, 중간 또는 종료와 같은 첫 번째 일치 항목이 제거됩니다.
$str = substr($str, 0, strpos($str, $prefix)).substr($str, strpos($str, $prefix)+strlen($prefix));
<?php
$str = 'bla_string_bla_bla_bla';
echo preg_replace('/bla_/', '', $str, 1);
?>
www를 제거하십시오. 문자열의 처음부터 가장 쉬운 방법입니다 (ltrim)
$a="www.google.com";
echo ltrim($a, "www.");
ltrim($a, "w.");
도메인이 "w"로 시작하지 않는 경우에만 작업을 수행합니다. ltrim ('m.google.com', ".omg")
결과 le.com
.
ltrim
잘못 사용됩니다. 두 번째 매개 변수는 트리밍해야하는 문자 목록입니다. 그러므로 하나면 "w."
충분하다.
s($str)->replacePrefix('_bla')
있는 것처럼 도움 이 될 수 있습니다 .