文字列の先頭から文字列を削除します


146

次のような文字列があります。

$str = "bla_string_bla_bla_bla";

どうすれば最初のものを削除できますかbla_。しかし、それが文字列の先頭にある場合のみですか?

ではstr_replace()すべて bla_のを削除します


回答:


339

正規表現なしのプレーンフォーム:

$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秒)。

明らかに、私のサーバーでプロファイリングされました。


8
3項演算子がそれほどひどく悪用されるのを見たことがありませんif(condition) { statement }
Tatu Ulmanen

4
@salathe:私は批判を受け入れます。何が最速かを見るのは個人的な好奇心でした。
ファビオ・モラ

51
@salathe、わかりません。慣用的なソリューションと正規表現ベースのソリューションの両方が提案されました。効率の観点から2つを比較すると、(効率の観点から)最良の答えを見つけるのに役立ちます。なぜそれが悪なのですか?
cbrandolino 2010

5
@cbrandolino、誰もそれがだとは言いませんでした。私はそれが質問とは全く無関係だと思っただけです。「ここには2つの解決策があります。ここに、より多くの賛成票を投じる子猫の写真があります」のようになります。
2010

5
if (substr($str, 0, strlen($prefix)) == $prefix) if (0 === strpos($str, $prefix))同じ読みやすさを維持しながら不要なメモリ割り当てを回避するために変更できます:)
xDaizu

63

正規表現とキャレット記号(^)を使用して、一致を文字列の先頭に固定できます。

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

substr()バージョンよりも高速に動作するかどうかは疑問です...私はそれが動作すると推測し、適切な回答としてマークする必要があります。
Flash Thunder

それがなければなりません除いてpreg_quote「D
vp_arth

これは、プログラマーの目にはそれほど痛くなく、より直感的だと思います。別の提案されたソリューション(本当に疑わしい)でパフォーマンスが低下したとしても、私はこれを好みます。
Fr0zenFyr

multibyte悪夢は他のソリューションの別の問題ですが、ファイルのエンコーディングが正しい場合は問題ありません。とにかく、それはこの質問の範囲内であってはならないので、私は気にしません。
Fr0zenFyr

これには、サブジェクト文字列の配列を操作するという追加の利点があることを述べました。substrそしてstrpos配列を受け入れることができません。これで、アレイを処理する場合のパフォーマンスが確実に向上しました。乾杯!
Fr0zenFyr

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

10
.''必要とされていません。
NateS 2014

1
すべての人がここでマイクロ最適化しているように見えるので、それが価値があるものについては、これは私の計算では常に最速です。100万回の反復が.17秒で行わ(substr($str, 0, strlen($prefix)) == $prefix)れましたが、受け入れられた回答は
.37に近いものでした

5

ここに。

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

2
0.0000459153秒を測定する:)
Fabio Mora

素晴らしい速度ですが、これはで終わる針に依存するようにハードコードされています_。一般的なバージョンはありますか?
toddmo

0

置換を文字列の一部に制限できる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)を使用できます。これにより、左から順に、置換の数を制限できますが、最初に強制することはありません。


1
substr_replace指定した範囲の文字を、削除する接頭辞かどうかに関係なく置き換えます。OPは、bla_「文字列の先頭にある場合のみ」を削除しようとしています。
Olivier 'Ölbaum' Scherler '31 / 03/31

0

素晴らしい速度ですが、これは_で終わる針に依存するようにハードコードされています。一般的なバージョンはありますか?– 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

0

これはさらに高速なアプローチです。

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

0

これにより、最初、中間、または最後の場所にある最初の一致が削除されます。

$str = substr($str, 0, strpos($str, $prefix)).substr($str, strpos($str, $prefix)+strlen($prefix));


-6

str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

今あなたがしたいことをします。

$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);

7
str_replace()関数の$countパラメータは、代替品の数を制限していない、見つかった代替品の数を含むように参照によって渡された変数であることが予想されます。
AL X

-6

wwwを削除します。文字列の先頭から、これが最も簡単な方法です(ltrim)

$a="www.google.com";
echo ltrim($a, "www.");

8
2番目のパラメーターは、文字列の左側から削除される文字のマップです(php.net/manual/function.ltrim.php)。したがって ltrim($a, "w.");、ドメインが「w」で始まらない場合にのみ、ジョブが実行されます。ltrim ('m.google.com', ".omg")結果はle.comです。
fragmentedreality

しかし、それは質問の特定の問題を解決します、+ 1
チュリアン

1
それは本当に彼が彼の答えのために作った特定の問題を解決します-問題の問題ではありません。を使用しても、ltrim誤って使用されます。2番目のパラメーターは、トリミングする必要がある文字のリストです。したがって、単一"w."で十分です。
fragmentedreality

私は、私見、それは質問にとっても問題にとっても正しいと思います。
abkrim 16

2
いくつかのテストを変更してテストした後、私の意見を変更しました...どんな状況でも質問には使えません
abkrim
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.