我有一個包含 HTMl 代碼的檔案,HTML 標記的編碼如下內容:
\x3cdiv data-name\x3d\x22region-name\x22 class\x3d\x22main-id\x22\x3eUK\x3c/div\x3e
解碼后的 HTML 應該是:
<div data-name="region-name" class="main-id">UK</div>
在 Ruby 中,我使用cgi了庫,unescapeHTML但是它不起作用,因為當它讀取內容時它無法識別編碼標簽,這是另一個示例:
require 'cgi'
single_quoted_string = '\x3cdiv data-name\x3d\x22region-name\x22 class\x3d\x22main-id\x22\x3eUK\x3c/div\x3e'
double_quoted_string = "\x3cdiv data-name\x3d\x22region-name\x22 class\x3d\x22main-id\x22\x3eUK\x3c/div\x3e"
puts 'unescape single_quoted_string ' CGI.unescapeHTML(single_quoted_string)
puts 'unescape double_quoted_string ' CGI.unescapeHTML(double_quoted_string)
前面代碼的輸出是:
unescape single_quoted_string \x3cdiv data-name\x3d\x22region-name\x22 class\x3d\x22main-id\x22\x3eUK\x3c/div\x3e
unescape double_quoted_string <div data-name="region-name" class="main-id">UK</div>
我的問題是,我怎樣才能使single_quoted_string行為就好像它的內容被雙引號一樣,以使函式理解編碼的標簽?
謝謝
uj5u.com熱心網友回復:
Ruby 的決議器允許字串文字中的某些轉義序列。
雙引號字串文字"\x3c"被識別為包含\xnn表示單個字符的十六進制模式<。(ASCII 中的 0x3C)
然而,單引號字串字面'\x3c'量按字面意思處理,即它代表四個字符:\、x、3和c。
我怎樣才能使
single_quoted_string行為好像它的內容被雙引號
你不能。為了將這四個字符轉換為<您必須自己決議字串:
str = '\x3c'
str[2, 2] #=> "3c" take hex part
str[2, 2].hex #=> 60 convert to number
str[2, 2].hex.chr #=> "<" convert to character
您可以將此應用于gsub:
str = '\x3cdiv data-name\x3d\x22region-name\x22 class\x3d\x22main-id\x22\x3eUK\x3c/div\x3e'
str.gsub(/\\x\h{2}/) { |m| m[2, 2].hex.chr }
#=> "<div data-name=\"region-name\" class=\"main-id\">UK</div>"
/\\x\h{2}/匹配文字反斜杠 ( \\) 后跟x兩個 ( {2}) 十六進制字符 ( \h)。
僅供參考,CGI 編碼的字串如下所示:
str = "<div data-name=\"region-name\" class=\"main-id\">UK</div>"
CGI.escapeHTML(str)
#=> "<div data-name="region-name" class="main-id">UK</div>"
它使用&...;樣式字符參考。
uj5u.com熱心網友回復:
您的問題與 HTML 無關,表示ascii 表\x3c中的十六進制數字 '3c' 。雙引號字串查找此模式并將它們轉換為所需的值,單引號字串將其視為最終結果。
您可以自己檢查 CGI 沒有做任何事情。
CGI.unescapeHTML(double_quoted_string) == double_quoted_string
我知道解決您的問題的最簡單方法是通過gsub
def convert(str)
str.gsub(/\\x(\w\w)/) do
[Regexp.last_match(1)].pack("H*")
end
end
single_quoted_string = '\x3cdiv data-name\x3d\x22region-name\x22 class\x3d\x22main-id\x22\x3eUK\x3c/div\x3e'
puts convert(single_quoted_string)
什么convert是獲取每對十六進制轉義值并將它們打包為字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/484986.html
下一篇:如何在方法中傳遞引數列舉?
