Entfernt eine Zeichenfolge am Anfang einer Zeichenfolge

Lesezeit: 5 Minuten

Entfernt eine Zeichenfolge am Anfang einer Zeichenfolge
Alex

Ich habe eine Zeichenfolge, die so aussieht:

$str = "bla_string_bla_bla_bla";

Wie kann ich die erste entfernen bla_; aber nur, wenn es am Anfang der Zeichenfolge gefunden wird?

Mit str_replace()es entfernt alle bla_‘S.

Entfernt eine Zeichenfolge am Anfang einer Zeichenfolge
Fabio Mora

Einfache Form, ohne Regex:

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

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

Dauert: 0,0369 ms (0,000.036.954 Sekunden)

Und mit:

$prefix = 'bla_';
$str="bla_string_bla_bla_bla";
$str = preg_replace('/^' . preg_quote($prefix, "https://stackoverflow.com/") . "https://stackoverflow.com/", '', $str);

Dauert: 0,1749 ms (0.000.174.999 Sekunden) der 1. Lauf (Kompilieren), und 0,0510 ms (0,000.051.021 Sekunden) nach.

Natürlich auf meinem Server profiliert.

  • Ich habe noch nie gesehen, dass der ternäre Operator so schlimm missbraucht wurde, ein einfacher if(condition) { statement } wäre so viel klarer gewesen.

    – Tatu Ulmanen

    23. Dezember 10 um 9:24 Uhr

  • @salathe: Ich akzeptiere die Kritik. Es war eine persönliche Neugier zu sehen, was am schnellsten war.

    – Fabio Mora

    23. Dezember 10 um 9:31 Uhr

  • @salathe, ich verstehe es nicht. Es wurden sowohl idiomatische als auch auf Regex basierende Lösungen vorgeschlagen: Der Vergleich der beiden in Bezug auf die Effizienz hilft, die beste (wiederum in Bezug auf die Effizienz) Antwort zu finden. Warum ist das böse?

    – cbrandolino

    23. Dezember 10 um 9:41 Uhr

  • @cbrandolino, niemand hat es gesagt böse. Ich dachte nur, dass es für die Frage völlig irrelevant ist; ähnlich wie “hier sind zwei Lösungen, und hier ist ein Bild von einigen Kätzchen für mehr Upvotes” wäre.

    – Salat

    23. Dezember 10 um 10:32 Uhr

  • if (substr($str, 0, strlen($prefix)) == $prefix) kann für geändert werden if (0 === strpos($str, $prefix)) um unnötige Speicherzuweisung zu vermeiden und gleichzeitig die gleiche Lesbarkeit beizubehalten 🙂

    – xDaizu

    1. Februar 17 um 9:17 Uhr

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

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

  • Ich frage mich, ob es schneller als funktioniert substr() Version … Ich denke, das tut es und sollte als richtige Antwort markiert werden.

    – Blitz Donner

    4. November 17 um 17:19 Uhr


  • außer es muss sein preg_quote‘D

    – vp_arth

    20. April 18 um 08:53 Uhr

  • Ich denke, dass dies für die Augen eines Programmierers viel weniger schmerzhaft und intuitiver ist. Selbst wenn es an Leistung gegenüber einer anderen vorgeschlagenen Lösung verliert (was ich wirklich bezweifle), würde ich diese immer noch bevorzugen.

    – Fr0zenFyr

    11. Juli 19 um 6:02 Uhr

  • multibyte Alptraum ist ein weiteres Problem mit anderen Lösungen, während dies gut funktioniert, wenn die Codierung der Datei korrekt ist. Wie auch immer, es sollte nicht im Rahmen dieser Frage liegen, also wäre es mir egal.

    – Fr0zenFyr

    11. Juli 19 um 6:04 Uhr

  • Kam zurück, um zu erwähnen, dass dies einen zusätzlichen Vorteil hat, wenn man mit einer Reihe von Subjektzeichenfolgen arbeitet. substr und strpos kann kein Array akzeptieren. Los geht’s, ein deutlicher Leistungsgewinn, wenn Sie es mit einem Array zu tun haben. Beifall!

    – Fr0zenFyr

    11. Juli 19 um 08:07 Uhr

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

  • Der .'' wird nicht benötigt.

    – NateS

    11. November 14 um 14:33 Uhr

  • Für das, was es wert ist, da hier anscheinend jeder mikrooptimiert, ist dieser nach meiner Zählung durchweg am schnellsten. 1 Million Iterationen kamen bei 0,17 Sekunden herein, wohingegen (substr($str, 0, strlen($prefix)) == $prefix) von der akzeptierten Antwort war eher wie .37

    – Von einem Grue gefressen

    31. Juli 15 um 5:33 Uhr

Hier.

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

Hier ist ein noch schnellerer Ansatz:

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

Schöne Geschwindigkeit, aber dies ist fest codiert, um von der Nadel abzuhängen, die mit _ endet. Gibt es eine allgemeine Version? – Toddmo 29. Juni um 23:26 Uhr

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 sn", "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 sn", "explode", $t);

Auf meinem ziemlich alten Heim-PC:

$ php bench.php

Ausgänge:

   strpos+strlen : 0.158388 s
         explode : 0.126772 s

1644312970 816 Entfernt eine Zeichenfolge am Anfang einer Zeichenfolge
Inka

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

Sie könnten den count-Parameter von str_replace ( http://nl3.php.net/manual/en/function.str-replace.php ), dies ermöglicht es Ihnen, die Anzahl der Ersetzungen zu begrenzen, beginnend von links, aber es wird nicht erzwungen, dass sie am Anfang stehen.

  • substr_replace ersetzt die Zeichen im angegebenen Bereich, unabhängig davon, ob es sich um das Präfix handelt, das Sie entfernen möchten, oder um etwas anderes. Das OP will entfernen bla_ “nur wenn es am Anfang der Zeichenfolge gefunden wird.”

    – Olivier „Ölbaum“ Scherler

    31. März ’16 um 10:30 Uhr

  • Diese Antwort ist irreführend und von geringem Wert. Wenn Sie nur Links löschen wollten, hätten Sie einfach einen Kommentar unter der Frage abgeben können. str_replace()Mit dem count-Parameter von können Sie die Anzahl der Ersetzungen NICHT begrenzen.

    – mickmackusa

    8. November 21 um 2:16 Uhr

.

820990cookie-checkEntfernt eine Zeichenfolge am Anfang einer Zeichenfolge

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy