Удалить строку из начала строки - PullRequest
124 голосов
/ 23 декабря 2010

У меня есть строка, которая выглядит следующим образом:

$str = "bla_string_bla_bla_bla";

Как убрать первый bla_; но только если он найден в начале строки?

С str_replace() удаляет все bla_.

Ответы [ 9 ]

293 голосов
/ 23 декабря 2010

Простая форма, без регулярных выражений:

$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 секунд) после.

Профиль на моем сервере, очевидно.

51 голосов
/ 23 декабря 2010

Вы можете использовать регулярные выражения с символом каретки (^), который привязывает соответствие к началу строки:

$str = preg_replace('/^bla_/', '', $str);
16 голосов
/ 19 мая 2013
function remove_prefix($text, $prefix) {
    if(0 === strpos($text, $prefix))
        $text = substr($text, strlen($prefix)).'';
    return $text;
}
5 голосов
/ 23 декабря 2010

Здесь.

$array = explode("_", $string);
if($array[0] == "bla") array_shift($array);
$string = implode("_", $array);
0 голосов
/ 14 октября 2018

Хорошая скорость, но она жестко запрограммирована и зависит от стрелки, заканчивающейся на _. Есть ли общая версия? - 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
0 голосов
/ 17 марта 2016

Удалить www.от начала строки, это самый простой способ (ltrim)

$a="www.google.com";
echo ltrim($a, "www.");
0 голосов
/ 20 мая 2014

str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

теперь делает то, что вы хотите.

$str = "bla_string_bla_bla_bla";
str_replace("bla_","",$str,1);
0 голосов
/ 23 декабря 2010

Я думаю, что 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), это позволит вам ограничить количество замен, начиная слева, но не приведет к тому, что оно будет в начале.

0 голосов
/ 23 декабря 2010
<?php
$str = 'bla_string_bla_bla_bla';
echo preg_replace('/bla_/', '', $str, 1); 
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...