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

时间:2014-06-16 07:44:28

标签: php trim

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

给出输出:

ello World
Hello World

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

3 个答案:

答案 0 :(得分:8)

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

  • \
  • x
  • 3
  • 0..\,即0\之内的任何内容,其中包括H
  • 9

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

"\x30..\x39"

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

答案 1 :(得分:3)

转义序列不会在单引号内解释。所以你的第二个参数是按字面解释的。它说修剪以下字符:

  • \
  • x
  • 3
  • 0\
  • x
  • 3
  • 9

如果您查看ASCII chart,则会发现0\的范围包含所有大写字母。

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

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

产生

Hello World

答案 2 :(得分:0)

当你的意思是使用十六进制的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'