【问题标题】:PHP addcslashes() function syntaxPHP addcslashes() 函数语法
【发布时间】:2020-05-18 13:26:48
【问题描述】:

PHP addcslashes() function 的手册页提供了以下示例:

addcslashes($not_escaped, "\0..\37!@\177..\377");

转义 0 到 31 之间的所有 ASCII 字符(= 037 八进制)。一位用户提出以下改进建议:

addcslashes($not_escaped, "\0..\37!@\@\177..\377");

“保护原始的、无辜的反斜杠免受 stripcslashes”。

是否有任何关于charlist 参数格式的文档?具体来说,第一个例子中的!@序列和第二个例子中的!@\@序列的解释是什么?

【问题讨论】:

  • 哇,你让我难倒这个。我不是最擅长阅读 C,但我找不到任何专门处理它的逻辑。有一个模糊的参考,!@ 创建了多个范围,但它在评论中。

标签: php escaping


【解决方案1】:

我花了一些时间才找到明显的。

!@ 不是特殊序列,它是应该转义的单个字符。 addcslashes 的唯一特殊输入是 char..char 用于范围。

\0..\37!@\177..\377 转义范围 0..\37,字符 !,字符 @ 和范围 \177..\377

我认为!@\@ 的建议无效(不干净)。 \@ 在 php 中没有被屏蔽(后面没有像 \n 那样的特殊含义),也是一样的。所以 \ 和 @ (第二次)被添加到字符列表中。 这背后没有魔法,也没有特殊的顺序。 当您想转义所有不可打印的字符(0-37 和 177+)时,干净的解决方案是:@、!、\:

"\0..\37!@\\\177..\377"

【讨论】:

  • 不错的调试!奇怪的是,这仍然是 PHP 的 mime 类型生成器今天仍在使用的转义序列:github.com/php/php-src/blob/…
  • 那是有线的......文件是6年前添加的,评论是18岁。也许它是未经检查就被复制的?
  • 谢谢!看起来这是在整个代码库中复制的字符串之一,而没有人真正知道它的用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多