回答:
正規表現なしのプレーンフォーム:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
if (substr($str, 0, strlen($prefix)) == $prefix) {
$str = substr($str, strlen($prefix));
}
所要時間:0.0369 ms(0.000,036,954秒)
そして:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
$str = preg_replace('/^' . preg_quote($prefix, '/') . '/', '', $str);
テイク:最初の実行(コンパイル)の0.1749ミリ秒(0.000,174,999秒)、その後の0.0510ミリ秒(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)
れましたが、受け入れられた回答は
ここに。
$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
誤って使用されます。2番目のパラメーターは、トリミングする必要がある文字のリストです。したがって、単一"w."
で十分です。
s($str)->replacePrefix('_bla')
にあるように、役立つ場合があります。