2017-02-27 45 views
2

this code golf answeraross給出了大概使用IBM-850編碼在PHP中的參數值」的解決方案如何使用PHP函數參數IBM-850編碼工作?

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

這是如何工作的?爲什麼沒有報價參數?爲什麼只對參數進行編碼,而不是代碼的其他人呢?

回答

3

它沒有這麼多IBM-850的事,這只是一個代碼頁填寫超越ASCII第8位給予的表示到你會落得個字節。

這裏的關鍵是我S的翻轉所有位bitwise not operator ~ - 0變爲1,1變爲0。如果你傾倒~"/^(.*?[aeiouy]+)/i"到一個文件,並打開其設置爲850,它會看起來像:

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

而且同樣~"$1 $1 $0"的樣子:

█╬▀█╬▀█¤ 

所以你看到,這是領導。

在PHP一個未定義的常量被假定爲具有一個字符串值匹配它的名字。例如:

var_dump(foo); 

輸出string(3) "foo"(以及通知「未定義恆富的使用 - 假設‘富’」,如果通知書上。)

當兩個亂碼字符串上述被放在一個PHP腳本沒有他們視爲與假設他們的價值觀,以及他們的名字未定義的常量報價。

現在在前面加上每個~其位翻轉回來,你已經得到了原正則表達式和替換字符串:

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

只有那些參數有其位翻轉,因爲他們是唯一的字符串文字,這就是這個技巧所適用的。對於每一個字符串它削去一對引號,以換取承擔只有一個波浪。

位翻轉必須這樣做,因爲無論是對自己的原始字符串的不帶引號就已經登陸解析錯誤。

聰明的方式,淨賺兩個字節。