我的数据库中保存了一个HTML文档,如下所示:
\\u003cp style=\\\"text-align: center; opacity: 1;\\\"\\u003e\\u003cstrong\\u003e\\u003cspan style=\\\"font-size: 18pt;\\\
我知道,这很丑陋,我知道,这不是理想的方式,但这是一个旧系统。
我的任务是获取所有这些HTML,并将它们转换为Google文档中的文档。实际上,Google文档可以很好地将HTML解析为其内部格式,但是HTML必须是有效的HTML,使用<p>
而不是\\u003cp
。
我正在尝试将此字符串转换/解码/解析/转换为有效的HTML,但是到目前为止,没有任何运气。
htmlentities gem,CGI解码,Nokogiri::HTML.parse
,JSON.parse
,但它们都没有完成。
我也尝试过string.encode(xxxx)
,但也没有碰运气。我真的希望.encode
方法可以做到,但我无法使其正常工作,也许我使用的编码错误? (我尝试使用所有ISO-xxx
编码)
答案 0 :(得分:1)
使用Array#pack
:
string = "\\u003cp style=\\\"text-align: center; opacity: 1;\\\"\\u003e\\u003cstrong\\u003e\\u003cspan style=\\\"font-size: 18pt;\\"
string.gsub(/\\u(....)/) { [$1.hex].pack("U") }
# => "<p style=\\\"text-align: center; opacity: 1;\\\"><strong><span style=\\\"font-size: 18pt;\\"
答案 1 :(得分:1)
以下是您的快速解决方法:
input_string.gsub(/\\u(\h{4})/) { [$1.to_i(16)].pack('U') }
使用上面提供的示例输入,结果为:
"<p style=\\\"text-align: center; opacity: 1;\\\"><strong><span style=\\\"font-size: 18pt;\\"
说明:
\u003c == <
。左侧是转义的unicode字符;这和\\u003c
不同,后者是一个文字反斜杠,后跟u003c
。
正则表达式\\u(\h{4})
将匹配该表达式的任何出现(\h
代表“十六进制”,等效于[0-9a-fA-F]
),Array#pack
将二进制序列转换为(在这种情况下)是UTF-8字符。
当然,理想情况下,您将从根本上解决问题,而不是重新设计这样的解决方法。但是,如果那超出了您的控制范围,则必须有一种解决方法。