为什么ltrim删除一个字符太多


Why does ltrim remove one character too much?

<?php
echo ltrim('12Hello World', ''x30..'x39');
echo "<br />";
echo ltrim('12Hello World', '0123456789');

给出输出:

ello World
Hello World

为什么?我知道它是一个字符数组,每个字符都被剥离,但如果是这种情况,为什么在第一种情况下删除H ?

''x30..'x39'是以下字符掩码:

  • '
  • x
  • 3
  • 0..',即从0',其中包括H
  • 9

您需要使用双引号,否则'xXX转义序列不会被解释为字节:

"'x30..'x39"

这是从字节x30x39的任何字符掩码,在ASCII和兼容编码中为0 - 9。

转义序列在单引号内不被解释。所以你的第二个论点是按字面理解的。它说要裁剪以下字符:

  • '
  • x
  • 3
  • 0'
  • x
  • 3
  • 9

如果你看一下ASCII图表,你会看到0'的范围包括所有的大写字母。

更改为双引号字符串以解释十六进制转义序列:

echo ltrim("12Hello World", "'x30..'x39")

生产:

Hello World

当您打算使用十六进制ascii字符时,必须使用双引号

// range 0 to 9
echo ltrim('12Hello World', "'x30..'x39"); // output will be Hello World

如果您使用单引号,那么character_mask ''x30..'x39'将被解释为

字符''', 'x', '3',范围为char '0' ~ ''',以及'x', '3', '9'