问答中心分类: PHP如何从字符串中删除前导字符?
0
匿名用户 提问 17小时 前

我有一个输入字符串,如:

$str = ':this is a applepie :) ';

如何删除第一个发生的:用PHP?
期望的输出:this is a applepie :)

Gordon 回复 17小时 前

可能的重复PHP减去字符串的第一个字符

Gordon 回复 17小时 前

可能的重复删除字符串 php 的前 4 个字符

6 Answers
0
mario 回答 17小时 前

substr()功能可能会在这里帮助你:

$str = substr($str, 1);

字符串从 0 开始索引,此函数的第二个参数采用 cutstart。所以把它设为 1,第一个字符就消失了。

Thomas Jensen 回复 17小时 前

请注意 unicode。如果您正在处理任意字符串(例如“Ål

anru 回复 17小时 前

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

rybo111 回复 17小时 前

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

rybo111 回复 17小时 前

谢谢。不过,请参阅我的更新。在 SQL 查询中使用更新的字符串时,它给我带来了问题。

Ian 回复 17小时 前

我刚试过$str[0] = '';解决方案和它没有工作。好吧,但是如果您随后计划使用该变量进行比较>或者<它行不通。例如,它仍然将 ` ` 视为 +`$str = 'hello'; $str[0] = ''; var_dump($str); // string(5) 'ello'

Qarib Haider 回复 17小时 前

@Ian:我在使用关键字从 API 获取记录时遇到了同样的问题,试过了var_dump($keyword)这是显示前一个字符长度..然后我尝试修剪关键字,然后它工作正常var_dump(trim($keyword))..希望这对某人有帮助.. 🙂

Josef Kufner 回复 17小时 前

这不起作用。 “已删除”位置被替换为空字节,因此您得到“\0hello”而不是“hello”。

Francisco Luz 回复 17小时 前

对于 $str[0] = “”; 我得到“警告:无法将空字符串分配给字符串偏移量”;

Emanuil Rusev 回复 17小时 前

这似乎也更快。

rybo111 回复 17小时 前

@EmanuilRusev 怎么样?只是好奇您的意思是输入速度更快还是运行速度更快。

Emanuil Rusev 回复 17小时 前

我的意思是它运行得更快。

rybo111 回复 17小时 前

@EmanuilRusev 如果您能提供一些统计数据,我会很感兴趣,因为我会添加到答案中。

thoughtrepo 回复 17小时 前

一定要小心这个。下面的代码输出 bool(false)。 $foo = ‘书’; $bar = ‘书’; $bar = substr($bar, 1); $foo[0] = ”; var_dump($foo === $bar);

ina 回复 17小时 前

为什么他们不相等?

rybo111 回复 17小时 前

@在一个gettype ()可能会揭示原因 – 我目前无法测试

ina 回复 17小时 前

从下面的线程 – 显然它是一个空字节,所以字符串比较失败

Paul Spiegel 回复 17小时 前

这不会删除第一个字符。它用不可打印的替换它chr(0).相当于$str[0] = chr(0);.您可以检查字符串代码var_dump(bin2hex($str));你会得到0048656c6c6f.先看那个00字节?

OzzyCzech 回复 17小时 前

快了 17.61%substr($str, 1)

Lucas Bustamante 回复 17小时 前

不幸的是,当您需要比较结果时,它不起作用。3v4l.org/14Ekm#focus=7.4.16

Raymie 回复 17小时 前

如果字符是货币符号,则很有用。

mickmackusa 回复 17小时 前

这个答案似乎完全忽略了 OP 的问题要求和示例字符串。这至多是另一个问题的正确答案。

anru 回复 17小时 前

这个不适用于单个字符串:比如“a”

calraiden 回复 17小时 前

你是对的 =) 所以,相信一个可能的解决方案是在它只包含一个字符之前进行测试。例如: $str = strlen($str) > 1 ? substr($str ,-(strlen($str)-1)) : $str;还是 $str = strlen($str) > 1 ? substr($str ,-(strlen($str)-1)) : ”;因为这个想法是删除最后一个字符,如果你只有一个……:P

0
alexn 回答 17小时 前

利用子串

$str = substr($str, 1); // this is a applepie :)
0
Hayenn 回答 17小时 前

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

rybo111 回复 17小时 前

谢谢。不过,请参阅我的更新。在 SQL 查询中使用更新的字符串时,它给我带来了问题。

Ian 回复 17小时 前

我刚试过$str[0] = '';解决方案和它没有工作。好吧,但是如果您随后计划使用该变量进行比较>或者<它行不通。例如,它仍然将 ` ` 视为 +`$str = 'hello'; $str[0] = ''; var_dump($str); // string(5) 'ello'

Qarib Haider 回复 17小时 前

@Ian:我在使用关键字从 API 获取记录时遇到了同样的问题,试过了var_dump($keyword)这是显示前一个字符长度..然后我尝试修剪关键字,然后它工作正常var_dump(trim($keyword))..希望这对某人有帮助.. 🙂

Josef Kufner 回复 17小时 前

这不起作用。 “已删除”位置被替换为空字节,因此您得到“\0hello”而不是“hello”。

Francisco Luz 回复 17小时 前

对于 $str[0] = “”; 我得到“警告:无法将空字符串分配给字符串偏移量”;

0
Dan Bray 回答 17小时 前

接受的答案:

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

有效,但会删除多个:当一开始有多个时。

$str = substr($str, 1);

将从一开始就删除任何字符。
然而,

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

完美运行。

0
rybo111 回答 17小时 前

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

有时您不需要函数:

$str[0] = '';

例如:

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

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

Emanuil Rusev 回复 17小时 前

这似乎也更快。

rybo111 回复 17小时 前

@EmanuilRusev 怎么样?只是好奇您的意思是输入速度更快还是运行速度更快。

Emanuil Rusev 回复 17小时 前

我的意思是它运行得更快。

rybo111 回复 17小时 前

@EmanuilRusev 如果您能提供一些统计数据,我会很感兴趣,因为我会添加到答案中。

thoughtrepo 回复 17小时 前

一定要小心这个。下面的代码输出 bool(false)。 $foo = ‘书’; $bar = ‘书’; $bar = substr($bar, 1); $foo[0] = ”; var_dump($foo === $bar);

ina 回复 17小时 前

为什么他们不相等?

rybo111 回复 17小时 前

@在一个gettype ()可能会揭示原因 – 我目前无法测试

ina 回复 17小时 前

从下面的线程 – 显然它是一个空字节,所以字符串比较失败

Paul Spiegel 回复 17小时 前

这不会删除第一个字符。它用不可打印的替换它chr(0).相当于$str[0] = chr(0);.您可以检查字符串代码var_dump(bin2hex($str));你会得到0048656c6c6f.先看那个00字节?

OzzyCzech 回复 17小时 前

快了 17.61%substr($str, 1)

Lucas Bustamante 回复 17小时 前

不幸的是,当您需要比较结果时,它不起作用。3v4l.org/14Ekm#focus=7.4.16