Antworten:
Schlichte Form ohne Regex:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
if (substr($str, 0, strlen($prefix)) == $prefix) {
$str = substr($str, strlen($prefix));
}
Dauer : 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) danach.
Offensichtlich auf meinem Server profiliert.
if(condition) { statement }
wäre so viel klarer gewesen.
if (substr($str, 0, strlen($prefix)) == $prefix)
kann geändert werden if (0 === strpos($str, $prefix))
, um unnötige Speicherzuweisung bei gleicher Lesbarkeit zu vermeiden :)
Sie können reguläre Ausdrücke mit dem Caret-Symbol ( ^
) verwenden, das die Übereinstimmung am Anfang der Zeichenfolge verankert:
$str = preg_replace('/^bla_/', '', $str);
substr()
Version funktioniert ... Ich denke, es funktioniert und sollte als richtige Antwort markiert werden.
preg_quote
'd
multibyte
Albtraum ist ein weiteres Problem bei anderen Lösungen, obwohl 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.
substr
und strpos
kann kein Array akzeptieren. Los geht's, ein deutlicher Leistungsgewinn, wenn Sie es mit einem Array zu tun haben. Prost!
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
.''
wird nicht benötigt.
(substr($str, 0, strlen($prefix)) == $prefix)
die akzeptierte Antwort eher
Hier.
$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
_
. Gibt es eine allgemeine Version?
Ich denke, substr_replace macht, 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 (Dies ermöglicht es Ihnen, nur zu betrachten der Anfang der Zeichenfolge.)
Sie können den count-Parameter von str_replace ( http://nl3.php.net/manual/en/function.str-replace.php ) verwenden. Dadurch können Sie die Anzahl der Ersetzungen von links beginnend begrenzen wird es nicht erzwingen, am Anfang zu sein.
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 möchte bla_
"nur entfernen, wenn es am Anfang der Zeichenfolge gefunden wird".
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 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 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 ziemlich alten Heim-PC:
$ php bench.php
Ausgänge:
strpos+strlen : 0.158388 s
explode : 0.126772 s
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));
Dadurch wird die erste Übereinstimmung entfernt, wo immer sie gefunden wird, dh Start oder Mitte oder Ende.
$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);
?>
str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
Jetzt macht was du willst.
$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);
str_replace()
der $count
Parameter der Funktion eine Variable ist, die als Referenz übergeben wird, um die Anzahl der gefundenen Ersetzungen zu enthalten, ohne die Anzahl der Ersetzungen zu begrenzen.
Entfernen Sie www. Dies ist vom Anfang der Zeichenfolge an der einfachste Weg (ltrim).
$a="www.google.com";
echo ltrim($a, "www.");
ltrim($a, "w.");
würde den Job nur machen, wenn die Domain nicht mit einem "w" beginnen würde. ltrim ('m.google.com', ".omg")
führt zu le.com
.
ltrim
, wird es falsch verwendet. Der zweite Parameter ist eine Liste von Zeichen, die gekürzt werden sollten. daher wäre eine einzige "w."
ausreichend.
s($str)->replacePrefix('_bla')
hilfreiche Informationen in dieser eigenständigen Bibliothek .