wake-up-neo.com

Entfernen Sie eine Zeichenfolge vom Anfang einer Zeichenfolge

Ich habe einen String, der so aussieht:

$str = "bla_string_bla_bla_bla";

Wie kann ich den ersten bla_ entfernen? aber nur wenn es am Anfang der Zeichenfolge steht?

Mit str_replace() entfernt er all bla_s.

118
Alex

Normalform ohne Regex:

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

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

Takes: 0,0369 ms (0,000,036,954 Sekunden)

Und mit:

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

Dauert: 0,1749 ms (0,000,174,999 Sekunden) beim ersten Durchlauf (Kompilieren) und 0,0510 ms (0,000,051,021 Sekunden).

Natürlich auf meinem Server.

282
Fabio Mora

Sie können reguläre Ausdrücke mit dem Caret-Symbol (^) verwenden, um die Übereinstimmung mit dem Anfang der Zeichenfolge zu verankern:

$str = preg_replace('/^bla_/', '', $str);
48
Tatu Ulmanen
function remove_prefix($text, $prefix) {
    if(0 === strpos($text, $prefix))
        $text = substr($text, strlen($prefix)).'';
    return $text;
}
16
Pavel

Hier.

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

Gute Geschwindigkeit, aber dies ist hartcodiert, um von der Nadel abzuhängen, die mit _ endet. Gibt es eine allgemeine Version? - toddmo 29. Juni um 23:26 

Eine allgemeine Version:

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

Einige Benchmarks:

<?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);

Auf meinem recht alten Heim-PC:

$ php bench.php

Ausgänge:

   strpos+strlen : 0.158388 s
         explode : 0.126772 s
0

Ich denke, substr_replace macht, was Sie wollen, wobei Sie Ihre Ersetzung auf einen Teil Ihrer Zeichenfolge beschränken können: http://nl3.php.net/manual/de/function.substr-replace.php (This können Sie nur den Anfang der Zeichenfolge betrachten.)

Sie können den Parameter count von str_replace ( http://nl3.php.net/manual/de/function.str-replace.php ) verwenden. Auf diese Weise können Sie die Anzahl der Ersetzungen ab dem Wert einschränken links, aber es wird nicht zwingen, am Anfang zu sein.

0
Inca
<?php
$str = 'bla_string_bla_bla_bla';
echo preg_replace('/bla_/', '', $str, 1); 
?>