如何在PHP中删除字符串的第一个字符?


Answers:


330

要从:字符串开头删除所有内容,可以使用ltrim

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

109
请注意,lrtim将删除所有:::::。有时,这不是理想的行为。
CoR 2013年

5
请注意,这仅适用于单个字符。ltrim会修剪提供的字符串中的所有字符:ltrim('prefixprefix_postfix', 'prefix')结果'_postfix';
Cody Django

555

substr()功能可能会在这里为您提供帮助:

 $str = substr($str, 1);

字符串从0开始索引,此函数的第二个参数采用cutstart。因此,将其设为1,第一个字符消失了。


35
注意unicode。如果要处理任意字符串(例如“Ål<-丹麦鳗鱼”),则应使用mb_substr并指定编码。
Thomas Jensen 2012年

这不是正确的实现,它不适用于单个字符串“ a”。如果您尝试使用单个字符串,则substr返回一个布尔值
anru 2015年

2
@anru手册指出如果字符串长度等于开始参数,则将返回一个空字符串。false返回版本7之前的版本。因此,如果这不是您想要的行为,则需要检查它们是否相等。
rybo111 '16

95

使用substr

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

很好的答案!感谢分享!但是,不太确定我能理解您的代码中有关applepie的注释。oO
HoldOffHunger

64

执行这三个答案的时间:

通过替换大小写删除第一个字母

$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 2014年

6
我只是尝试了$str[0] = '';解决方案,但没有成功。很好,但是如果您打算使用变量进行比较><则该方法还是行不通的。例如,它仍将``视为+` $str = 'hello'; $str[0] = ''; var_dump($str); // string(5) 'ello'
Ian

@Ian:我在使用关键字从API提取记录时遇到了同样的问题,尝试var_dump($keyword)显示前一个字符长度..然后尝试修剪关键字,然后效果很好var_dump(trim($keyword))..希望这对某人有所帮助.. :)
Syed Qarib'3

3
这是行不通的。“已删除”位置被替换为空字节,因此您得到的是“ \ 0hello”而不是“ hello”。
Josef Kufner 2015年

1
对于$ str [0] =“”,我收到“警告:无法将空字符串分配给字符串偏移量”;
弗朗西斯科·卢兹

25

这是代码

$str = substr($str, 1); 

echo $str;

输出:

this is a applepie :)

11

要在PHP中删除字符串的第一个字符,

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

echo $new_string;
Generates: "bcdef"

9
$str = substr($str, 1);

参见PHP手册示例3

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

注意:

unset($str[0]) 

无法使用,因为您无法取消设置字符串的一部分:-

Fatal error: Cannot unset string offsets

9

更新资料

经过进一步测试后,我不建议再使用此功能。在MySQL查询中使用更新的字符串并进行更改以substr解决问题时,这对我造成了问题。我曾考虑删除此答案,但评论表明它以某种方式更快,因此有人可能会用到它。您可能会发现修剪更新的字符串可以解决字符串长度问题。


有时您不需要功能:

$str[0] = '';

例如:

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

此方法修改现有字符串,而不是创建另一个。


这似乎也更快。
Emanuil Rusev 2014年

@EmanuilRusev怎么回事?只是想知道是说它输入速度更快还是运行更快。
rybo111 2014年

我的意思是它运行得更快。
Emanuil Rusev 2014年

@EmanuilRusev如果您可以提供一些统计信息,我会很感兴趣,因为我将添加到答案中。
rybo111 2014年

1
一定要小心。下面的代码输出bool(false)。$ foo ='book'; $ bar ='book'; $ bar = substr($ bar,1); $ foo [0] =''; var_dump($ foo === $ bar);
Thoughtrepo 2014年

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

从字符串+空格的开头和结尾开始修剪数组中每个单词的出现,并根据正常trim()可选地多余的单个字符

<?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 2015年

您是对的=)因此,相信一种可能的解决方案是在仅包含一个字符之前进行测试。例如:$ str = strlen($ str)> 1吗?substr($ str,-(strlen($ str)-1)):$ str; 或者$ str = strlen($ str)> 1?substr($ str,-(strlen($ str)-1)):''; 因为这个想法是要删除最后一个字符,如果您只有一个... ...:P
Claudionor Oliveira

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.