Jak usunąć pierwszy znak ciągu znaków w PHP?

Odpowiedzi:

330

Aby usunąć każdy :z początku łańcucha, możesz użyć ltrim :

$str = '::f:o:';
$str = ltrim($str, ':');
var_dump($str); //=> 'f:o:'
Haim Evgi
źródło
109
Zauważ, że lrtim usunie wszystko :::::. Czasami nie jest to pożądane zachowanie.
KR
5
zwróć uwagę, że jest to przeznaczone tylko dla pojedynczych znaków. ltrim będzie przyciąć wszystkie znaki w podanym ciągu znaków: ltrim('prefixprefix_postfix', 'prefix')wyniki w'_postfix';
Cody Django
556

substr()Funkcja będzie prawdopodobnie pomóc tutaj:

 $str = substr($str, 1);

Łańcuchy są indeksowane od 0, a ten drugi parametr funkcji uruchamia cutstart. Więc zrób 1, a pierwszy znak zniknie.

Mario
źródło
35
Uważaj na Unicode. Jeśli masz do czynienia z dowolnym ciągiem znaków (np. „Ål <- danish for eel”), powinieneś użyć mb_substr i określić kodowanie.
Thomas Jensen,
nie jest to poprawna implementacja, nie działa z ciągiem znaków „a”. jeśli spróbujesz łańcucha
jednoznakowego
2
@anru Instrukcja podaje, że jeśli długość łańcucha jest równa parametrowi początkowemu, zostanie zwrócony pusty ciąg. Przed wersją 7 falsezostał zwrócony. Musisz więc sprawdzić, czy są równe, jeśli nie jest to pożądane zachowanie.
rybo111
95

Użyj substr :

$str = substr($str, 1); // this is a applepie :)
alexn
źródło
Doskonała odpowiedź! Dzięki za udostępnienie! Nie jestem jednak pewien, czy rozumiem komentarz w twoim kodzie na temat aplikacji. oO
HoldOffHunger
64

Czas wykonania dla 3 odpowiedzi:

Usuń pierwszą literę, zastępując obudowę

$str = "hello";
$str[0] = "";
// $str[0] = false;
// $str[0] = null;
// replaced by �, but ok for echo

Czas wykonania dla 1.000.000 testów: 0.39602184295654sek


Usuń pierwszą literę z substr ()

$str = "hello";
$str = substr($str, 1);

Czas wykonania dla 1.000.000 testów: 5.153294801712sek


Usuń pierwszą literę za pomocą ltrim ()

$str = "hello";
$str= ltrim ($str,'h');

Czas wykonania dla 1.000.000 testów: 5.2393000125885sek


Usuń pierwszą literę za pomocą preg_replace ()

$str = "hello";
$str = preg_replace('/^./', '', $str);

Czas wykonania dla 1.000.000 testów: 6.8543920516968sek

Hayenn
źródło
Dzięki. Zobacz jednak moją aktualizację. To spowodowało problem podczas używania zaktualizowanego ciągu w zapytaniu SQL.
rybo111
6
Właśnie wypróbowałem $str[0] = '';rozwiązanie i nie zadziałało. robi to jednak dobrze, jeśli planujesz na przykład użyć zmiennej do porównania, bo >inaczej <nie zadziała. Nadal liczy się jako `` jak + '', na przykład $str = 'hello'; $str[0] = ''; var_dump($str); // string(5) 'ello'
Ian
@Ian: Natknąłem się na ten sam problem podczas pobierania rekordów z interfejsu API za pomocą słowa kluczowego. Próbowałem, var_dump($keyword)który wyświetlał poprzednią długość znaku. Potem spróbowałem przyciąć słowo kluczowe, a potem zadziałało var_dump(trim($keyword)). Mam nadzieję, że to komuś pomoże :)
Syed Qarib,
3
To nie działa. Pozycja „usunięta” jest zastąpiona bajtem zerowym, więc zamiast „cześć” pojawia się „\ 0hello”.
Josef Kufner
1
Pojawia się komunikat „Ostrzeżenie: nie można przypisać pustego łańcucha do przesunięcia łańcucha” dla $ str [0] = "";
Francisco Luz
25

Oto kod

$str = substr($str, 1); 

echo $str;

Wynik:

this is a applepie :)
Tarun modi
źródło
11

Aby usunąć pierwszy znak ciągu znaków w PHP,

$string = "abcdef";     
$new_string = substr($string, 1);

echo $new_string;
Generates: "bcdef"
Chandan Sharma
źródło
9
$str = substr($str, 1);

Zobacz podręcznik PHP 3 przykład

echo substr('abcdef', 1);     // bcdef

Uwaga:

unset($str[0]) 

nie będzie działać, ponieważ nie można rozbroić części ciągu: -

Fatal error: Cannot unset string offsets
Gammerz
źródło
9

Aktualizacja

Po dalszych testach nie polecam już tego używać. To spowodowało problem podczas używania zaktualizowanego ciągu w zapytaniu MySQL i zmiany w celu substrrozwiązania problemu. Myślałem o usunięciu tej odpowiedzi, ale komentarze sugerują, że jest ona jakoś szybsza, więc ktoś może ją wykorzystać. Może się okazać, że przycięcie zaktualizowanego łańcucha rozwiąże problemy z długością łańcucha.


Czasami nie potrzebujesz funkcji:

$str[0] = '';

Na przykład:

$str = 'AHello';
$str[0] = '';
echo $str; // 'Hello'

Ta metoda modyfikuje istniejący ciąg zamiast tworzyć inny.

rybo111
źródło
To też wydaje się szybsze.
Emanuil Rusev
@EmanuilRusev jak to zrobić? Ciekawe, czy masz na myśli szybsze pisanie lub szybsze działanie.
rybo111
Mam na myśli, że działa szybciej.
Emanuil Rusev
@EmanuilRusev Byłbym zainteresowany, gdybyś mógł podać statystyki, które dodam do odpowiedzi.
rybo111
1
Uważaj na to. Poniższy kod wyświetla wynik bool (false). $ foo = „book”; $ bar = „książka”; $ bar = substr ($ bar, 1); $ foo [0] = ''; var_dump ($ foo === $ bar);
thinkrepo
8

Akceptowana odpowiedź:

$str = ltrim($str, ':');

działa, ale usunie wiele, :jeśli na początku jest więcej niż jeden.

$str = substr($str, 1);

usunie dowolną postać od początku.

Jednak,

if ($str[0] === ':')
    $str = substr($str, 1);

działa świetnie.

Dan Bray
źródło
6

możesz użyć funkcji sbstr ()

$amount = 1;   //where $amount the the amount of string you want to delete starting  from index 0
$str = substr($str, $amount);
Adeojo Emmanuel IMM
źródło
2

Przycina wystąpienia każdego słowa w tablicy od początku i końca łańcucha + białych znaków i opcjonalnie dodatkowych pojedynczych znaków, jak w przypadku zwykłego przycinania ()

<?php
function trim_words($what, $words, $char_list = '') {
    if(!is_array($words)) return false;
    $char_list .= " \t\n\r\0\x0B"; // default trim chars
    $pattern = "(".implode("|", array_map('preg_quote', $words)).")\b";
    $str = trim(preg_replace('~'.$pattern.'$~i', '', preg_replace('~^'.$pattern.'~i', '', trim($what, $char_list))), $char_list);
    return $str;
}

// for example:
$trim_list = array('AND', 'OR');

$what = ' OR x = 1 AND b = 2 AND ';
print_r(trim_words($what, $trim_list)); // => "x = 1 AND b = 2"

$what = ' ORDER BY x DESC, b ASC, ';
print_r(trim_words($what, $trim_list, ',')); // => "ORDER BY x DESC, b ASC"
?>
Ben
źródło
1

Kod działa dobrze dla mnie.

$str = substr($str ,-(strlen($str)-1));

Może również udzielić odpowiedzi.

Claudionor Oliveira
źródło
1
ten nie działa z ciągiem
jednoznakowym
Masz rację =) Więc uwierz, że możliwym rozwiązaniem byłoby przetestowanie, zanim będzie zawierała tylko jedną postać. Na przykład: $ str = strlen ($ str)> 1? substr ($ str, - (strlen ($ str) -1)): $ str; Lub $ str = strlen ($ str)> 1? substr ($ str, - (strlen ($ str) -1)): ''; ponieważ chodzi o to, aby usunąć ostatnią postać, jeśli masz tylko jedną ...: P
Claudionor Oliveira
1

użyj funkcji mb_substr

    mb_substr("我abc", 1);
风声 猎猎
źródło
Przydatne, jeśli postać jest symbolem waluty.
Raymie,