Відповіді:
Звичайна форма, без регулярного вираження:
$prefix = 'bla_';
$str = 'bla_string_bla_bla_bla';
if (substr($str, 0, strlen($prefix)) == $prefix) {
$str = substr($str, strlen($prefix));
}
Займає: 0,0369 мс (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 секунди) 1-го запуску (компіляція) та 0,0510 мс (0,000,051,021 секунди) після.
Профільно на моєму сервері, очевидно.
if(condition) { statement }
був би набагато зрозумілішим.
if (substr($str, 0, strlen($prefix)) == $prefix)
можна змінити, if (0 === strpos($str, $prefix))
щоб уникнути зайвого розподілу пам’яті, зберігаючи таку ж читабельність :)
Ви можете використовувати регулярні вирази із символом caret ( ^
), який закріплює збіг до початку рядка:
$str = preg_replace('/^bla_/', '', $str);
substr()
версія ... Я думаю, що це робить, і має бути позначена як відповідна відповідь.
preg_quote
'd
multibyte
кошмар - це ще одна проблема з іншими рішеннями, хоча це працює добре, якщо кодування файлу є правильним. У всякому разі, це не повинно входити до цього питання, щоб я не хвилювався.
substr
і strpos
не можу прийняти масив. Ось певне підвищення продуктивності, якщо ви маєте справу з масивом. Ура!
function remove_prefix($text, $prefix) {
if(0 === strpos($text, $prefix))
$text = substr($text, strlen($prefix)).'';
return $text;
}
.''
Не потрібно.
(substr($str, 0, strlen($prefix)) == $prefix)
з прийнятої відповіді було більше схоже на
Ось
$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
_
. Чи є загальна версія?
Я думаю, що substr_replace робить все, що ви хочете, і ви можете обмежити свою заміну частиною рядка: http://nl3.php.net/manual/en/function.substr-replace.php (Це дозволить вам дивитися лише на початок рядка.)
Ви можете використовувати параметр count str_replace ( http://nl3.php.net/manual/en/function.str-replace.php ), це дозволить вам обмежити кількість замін, починаючи зліва, але це не буде примушувати його бути на початку.
substr_replace
замінить символи в заданому діапазоні незалежно від того, чи є вони префіксом, який ви хочете видалити, чи чимось іншим. ОП хоче видалити bla_
"лише в тому випадку, якщо він знайдений на початку рядка".
Приємна швидкість, але це важко кодується залежно від голки, що закінчується символом _. Чи є загальна версія? - Тоддмо 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);
На моєму досить старому домашньому ПК:
$ php bench.php
Виходи:
strpos+strlen : 0.158388 s
explode : 0.126772 s
Ось ще швидший підхід:
// strpos is faster than an unnecessary substr() and is built just for that
if (strpos($str, $prefix) === 0) $str = substr($str, strlen($prefix));
Це видалить першу відповідність, де б не було знайдено, тобто, початок, середина чи кінець.
$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 ] )
тепер робить те, що ти хочеш.
$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);
str_replace()
, що $count
параметр функції буде змінною, переданою за посиланням, щоб містити кількість знайдених замін, а не обмежувати кількість замін.
Видалити www. від початку рядка, це найпростіший спосіб (ltrim)
$a="www.google.com";
echo ltrim($a, "www.");
ltrim($a, "w.");
зробить цю роботу лише в тому випадку, якщо домен не починається з "w". ltrim ('m.google.com', ".omg")
результати в le.com
.
ltrim
, він використовується неправильно. другий параметр - це список символів, які слід обрізати; тому одного "w."
було б достатньо.
s($str)->replacePrefix('_bla')
корисні, як це знайдено в цій самостійній бібліотеці .