IBM-850 编码如何使用 PHP 函数参数?

How does IBM-850 encoding work with PHP function parameters?

this code golf answer, aross中给出了一个解决方案,大概使用IBM-850编码作为PHP中的参数值

echo preg_filter("/^(.*?[aeiouy]+)/i","  [=11=]",$argn);
echo preg_filter(~ðíÎÐı└ñ×ÜûÉèåóÈÍðû,~█╬▀█╬▀█¤,$argn);     # Encoded

这是如何工作的?为什么不引用参数?为什么只有参数被编码而其余代码没有被编码?

它与 IBM-850, that's just a codepage filling out the 8th bit beyond ASCII 没有太多关系来表示您最终得到的字节。

这里的关键是 bitwise not operator ~ 翻转所有位 - 0 变为 1,1 变为 0。如果将 ~"/^(.*?[aeiouy]+)/i" 转储到文件并以 850 格式打开它,它将看起来像:

ðíÎÐı└ñ×ÜûÉèåóÈÍðû

同样 ~" [=16=]" 看起来像:

█╬▀█╬▀█¤

所以你看到了它的发展方向。

在PHP中,假定未定义常量具有与其名称匹配的字符串值。例如:

var_dump(foo);

输出 string(3) "foo"(以及通知 "Use of undefined constant foo - assumed 'foo'",如果通知已打开。)

当上面两个乱七八糟的字符串中的任何一个被放入不带引号的 PHP 脚本中时,它们将被视为未定义的常量,它们的名称也被假定为它们的值。

现在在每个前面加上 ~ 以翻转它们的位,您就得到了原始的正则表达式和替换字符串:

preg_filter("/^(.*?[aeiouy]+)/i","  [=13=]",$argn)

只有那些参数的位被翻转了,因为它们是唯一的字符串文字,这就是这个技巧适用的地方。对于每个字符串,它都会去掉一对引号,以换取只使用一个波浪号。

必须进行位翻转,因为没有引号的原始字符串中的任何一个都会导致解析错误。

净两个字节的聪明方法。