【问题标题】:Why does ltrim remove one character too much?为什么 ltrim 删除一个字符太多?
【发布时间】:2014-06-16 07:44:27
【问题描述】:
<?php
echo ltrim('12Hello World', '\x30..\x39');
echo "<br />";
echo ltrim('12Hello World', '0123456789');

给出输出:

ello World
Hello World

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

【问题讨论】:

  • 您确定要向我们展示您的所有代码吗?请在开头显示任何代码。
  • @nl-x 它是可复制的。至少在 5.5 上。
  • 去掉\, x, 3, 范围0到\, 3, 9。\是ASCII表中小写字母和大写字母之间的关系。

标签: php trim


【解决方案1】:

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

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

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

"\x30..\x39"

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    产生:

    Hello World
    

    【讨论】:

      【解决方案3】:

      当您的意思是使用十六进制 ascii 字符时,您必须使用 双引号

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

      如果使用单引号,那么字符掩码'\x30..\x39'会解释为

      字符'\''x''3',范围从字符'0''\',以及'x''3''9'

      【讨论】:

        猜你喜欢
        • 2018-10-14
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        • 2023-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多