Hãy phân tích từng thông số str_replace
.
range('-',T)
Hàm range()
trả về mảng có các phần tử trải dài từ tham số đầu tiên đến thông số thứ hai. Nhân vật được xem xét giá trị ASCII của họ, vì vậy kết quả là
Array
(
[0] => -
[1] => .
[2] =>/
[3] => 0
[4] => 1
[5] => 2
[6] => 3
[7] => 4
[8] => 5
[9] => 6
[10] => 7
[11] => 8
[12] => 9
[13] => :
[14] => ;
[15] => <
[16] => =
[17] => >
[18] => ?
[19] => @
[20] => A
[21] => B
[22] => C
[23] => D
[24] => E
[25] => F
[26] => G
[27] => H
[28] => I
[29] => J
[30] => K
[31] => L
[32] => M
[33] => N
[34] => O
[35] => P
[36] => Q
[37] => R
[38] => S
[39] => T
)
Tại sao T
thay vì "T"
? PHP có một sự đáp ứng mà làm cho nó đánh giá các hằng số không xác định là các chuỗi có cùng nội dung với tên của hằng số. Hằng số T
không được xác định vì vậy nó giống như "T"
giúp tiết kiệm hai ký tự cho mục đích chơi mã. Tương tự như vậy cho q
sau đó. Nếu máy chủ có báo cáo lỗi, nó sẽ hiển thị cảnh báo về một hằng số không xác định.
split(q,"I justCannaLE?2Gotta >u=Msta=.q...");
Việc này chia chuỗi thành một mảng tại q
ký tự. Một lần nữa, điều này làm cho mã ngắn hơn so với sử dụng một mảng chữ. Kết quả:
Array
(
[0] =>
I justCannaLE?2Gotta >u=Msta=.
[1] =>
Ng1Nlet? downNrun<rH=5desMt?N>cryNsayRoodbyeNtE< lie5hurt?
[2] =>
We'T3n [email protected] s8lSg6r hear9<ch: but6;Lo7hyL7BInsideCe both3Cha9Ro: S
We3KeRa45we;QplB
[3] => 1)O)NgiT, nPgiT
(G
[4] => iT? up
[5] => howFJeel:
[6] => know
[7] => me
[8] => <=
[9] =>
YH
[10] => 8s
[11] => o
[12] => t's been
[13] => ing
[14] => 're
[15] => a
[16] => nd
[17] => make?
[18] => yH
[19] => othM
[20] => A
[21] => ay it
[22] => w
[23] => D
[24] => ell
[25] => I'm
[26] => G
[27] => ou
[28] => I
[29] => f
[30] => Lh
[31] => t
[32] => er
[33] =>
NP
[34] =>
(Ooh
[35] => eTrQ
[36] => RSna
[37] => g
[38] => on
[39] => ve
)
Thông số cuối cùng là chuỗi đích.
"We; n7trangMsL8loT63Ke rules5s8d8I
AJull commit4nt'sChatFKink: of6CHldn'tRetKisJrom<[email protected]/A= if?<sk 42DS'tLE 4?;Lo8bli=L7ee..
O,R1)O,R001)/-.."
Nếu bạn chuyển mảng vào str_replace()
như kim và haystack, thay thế được thực hiện từng lần một. Vì mục đích đơn giản, chúng ta hãy chỉ cần "We; n7trangMs"
làm chuỗi thẻ và bắt đầu thay thế từ ;
.Bước đầu tiên sau khi thay "7"
với "8s"
(thay thế tương ứng trong mảng thứ hai):
"We; n8strangMs"
Sau đó thay thế "8"
với "o "
"We; no strangMs"
";"
với "'re"
"We're no strangMs"
"M"
với "er"
"We're no strangers"
Tóm lại, đây là thuật toán nén cơ bản nơi bạn tìm chuỗi ký tự lặp lại bên trong văn bản gốc và thay thế bằng ký tự đơn. Khi giải nén ký tự đó được thay thế bằng chuỗi gốc. Bằng cách chạy tiến trình lặp lại, bạn có thể nén lại văn bản đã nén một lần nữa ("o s"
=>"8s"
=>"7"
).
Cảm ơn câu trả lời rất tốt này. Những gì tôi đã mất ở đây là bạn thay thế nhiều lần. Cách đơn giản nhất để nén văn bản là gì? (Tác giả đã tìm thấy chuỗi nén như thế nào?) – Imateapot
Tác giả có thể đã sử dụng một số thuật toán nén. Làm theo cách thủ công sẽ là rất nhiều công việc. – JJJ
Tôi có thể tìm mã nén bằng cách 'đảo ngược' mã không nén? – Imateapot