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.
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.
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
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
.
Sie könnten finden
s($str)->replacePrefix('_bla')
hilfreich, wie in gefunden diese eigenständige Bibliothek.– kräh
28. Juli 16 um 4:06 Uhr