Як видалити перший символ рядка в PHP?


Відповіді:


330

Щоб видалити кожен :з початку рядка, ви можете використовувати ltrim :

$str = '::f:o:';
$str = ltrim($str, ':');
var_dump($str); //=> 'f:o:'

109
Зауважте, що lrtim видалить усіх :::::. Іноді це не бажана поведінка.
КР

5
зауважте, що це призначено лише для одиночних символів. ltrim обріже всіх символів у наданій рядку: ltrim('prefixprefix_postfix', 'prefix')результати в'_postfix';
Коді Джанго

556

substr()Функція, ймовірно , допоможе вам тут:

 $str = substr($str, 1);

Рядки індексуються починаючи з 0, і цей параметр функцій другий параметр приймає на початку. Тож зробіть це 1, і першого знака вже немає.


35
Будьте в курсі Unicode. Якщо ви маєте справу з довільним рядком (наприклад, "Ål <- датський для вугра"), вам слід скористатися mb_substr та вказати кодування.
Томас Дженсен

це не правильна реалізація, вона не працює з одним символьним рядком "a". якщо ви спробуєте
однорядний

2
@anru У посібнику зазначено, що якщо довжина рядка дорівнює стартовому параметру, повернеться порожній рядок. До версії 7 falseбуло повернуто. Тож вам слід перевірити, чи вони рівні, якщо це не поведінка, яку ви хочете.
rybo111

95

Використовуйте підряд :

$str = substr($str, 1); // this is a applepie :)

Відмінна відповідь! Дякую, що поділились! Не зовсім впевнений, я розумію коментар у вашому коді щодо яблука. оо
HoldOffHunger

64

Визнач час для 3 відповідей:

Видаліть перший лист, замінивши корпус

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

Виконати час для 1 000 000 тестів: 0.39602184295654сек


Видаліть першу букву з substr ()

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

Виконати час для 1 000 000 тестів: 5.153294801712сек


Видаліть першу букву за допомогою ltrim ()

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

Виконати час для 1 000 000 тестів: 5.2393000125885сек


Видаліть перший лист за допомогою preg_replace ()

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

Виконати час для 1 000 000 тестів: 6.8543920516968сек


Дякую. Дивіться, однак, моє оновлення. Це спричинило для мене проблему при використанні оновленого рядка в SQL-запиті.
rybo111

6
Я просто спробував $str[0] = '';рішення, і воно не вийшло . добре, але це все-таки, якщо ви потім плануєте використовувати змінну, наприклад, для порівняння >або <вона не буде працювати. Наприклад, він як і раніше вважається "як +" $str = 'hello'; $str[0] = ''; var_dump($str); // string(5) 'ello'
Іван,

@Ian: Я зіткнувся з тією ж проблемою під час отримання записів з API за допомогою ключового слова, спробував var_dump($keyword)показати попередню довжину символів .. потім я спробував обрізати ключове слово, і тоді воно спрацювало чудово var_dump(trim($keyword)). Сподіваюся, це комусь допомагає .. :)
Сиєд Каріб

3
Це не працює. Позиція "вилучено" замінюється нульовим байтом, тому ви отримуєте "\ 0hello" замість "привіт".
Йозеф Куфнер

1
Я отримую "Попередження: Не можу призначити порожній рядок зміщення рядка" для $ str [0] = "";
Франциско Луз


11

Щоб видалити перший символ символу рядка в PHP,

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

echo $new_string;
Generates: "bcdef"


9

Оновлення

Після подальших тестів я більше не рекомендую користуватися цим. Це спричинило для мене проблему при використанні оновленого рядка в запиті MySQL та зміні на substrвирішення проблеми. Я думав над тим, щоб видалити цю відповідь, але коментарі припускають, що це якось швидше, щоб хтось міг використовувати це. Ви можете обрізати оновлений рядок, який вирішує проблеми з довжиною рядка.


Іноді вам не потрібна функція:

$str[0] = '';

Наприклад:

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

Цей метод модифікує існуючий рядок, а не створює інший.


Це, здається, теж швидше.
Емануїл Русєв

@EmanuilRusev як так? Просто цікаво, якщо ви маєте на увазі, що це швидше вводити текст або він працює швидше.
rybo111

Я маю на увазі, що вона бігає швидше.
Емануїл Русєв

@EmanuilRusev Мені буде цікаво, якщо ви можете надати деякі статистичні дані, як я додам до відповіді.
rybo111

1
Треба бути обережними з цим. Код нижче виводить bool (false). $ foo = 'книга'; $ bar = 'книга'; $ bar = substr ($ bar, 1); $ foo [0] = ''; var_dump ($ foo === $ bar);
thinkrepo

8

Прийнята відповідь:

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

працює, але буде видалено декілька, :коли їх на початку більше.

$str = substr($str, 1);

видалить будь-який символ із самого початку.

Однак,

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

працює чудово.


6

ви можете використовувати функцію sbstr ()

$amount = 1;   //where $amount the the amount of string you want to delete starting  from index 0
$str = substr($str, $amount);

2

Обрізає походження кожного слова в масиві з початку та в кінці рядка + пробіл та, можливо, додаткові окремі символи відповідно до нормальної обрізки ()

<?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"
?>

1

Код добре працює для мене.

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

Можливо, теж дайте відповіді.


1
цей не працює з одним символьним рядком: на кшталт "a"
anru

Ви маєте рацію =) Отже, вважайте, що можливим рішенням буде тестування, перш ніж він містить лише один символ. Наприклад: $ str = strlen ($ str)> 1? substr ($ str, - (strlen ($ str) -1)): $ str; Або $ str = strlen ($ str)> 1? substr ($ str, - (strlen ($ str) -1)): ''; тому що ідея полягає в тому, щоб зняти останнього персонажа, якщо у вас є лише один ...: P
Клаудіонер Олівейра

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.