URL/HTML/JavaScript的encode/escape

news/2024/7/11 1:37:42 标签: HTML, JavaScript, Ruby, CGI, jQuery
最近经常被URL、HTMLJavaScript的encode/escape弄晕

在这里列出Ruby/JavaScript中一些方法的说明:

[b]1,CGI.escape/CGI.unescape做URL的encode和decode[/b]
参加Ruby库中的cgi.rb
[code]
# URL-encode a string.
# url_encoded_string = CGI::escape("'Stop!' said Fred")
# # => "%27Stop%21%27+said+Fred"
def CGI::escape(string)
string.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
'%' + $1.unpack('H2' * $1.size).join('%').upcase
end.tr(' ', '+')
end


# URL-decode a string.
# string = CGI::unescape("%27Stop%21%27+said+Fred")
# # => "'Stop!' said Fred"
def CGI::unescape(string)
string.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
[$1.delete('%')].pack('H*')
end
end
[/code]

[b]2,CGI.escapeHTML/CGI.unescapeHTMLHTML的escape/unescape[/b]
参加Ruby库中的cgi.rb
[code]
# Escape special characters in HTML, namely &\"<>
# CGI::escapeHTML('Usage: foo "bar" <baz>')
# # => "Usage: foo "bar" <baz>"
def CGI::escapeHTML(string)
string.gsub(/&/n, '&').gsub(/\"/n, '"').gsub(/>/n, '>').gsub(/</n, '<')
end


# Unescape a string that has been HTML-escaped
# CGI::unescapeHTML("Usage: foo "bar" <baz>")
# # => "Usage: foo \"bar\" <baz>"
def CGI::unescapeHTML(string)
string.gsub(/&(amp|quot|gt|lt|\#[0-9]+|\#x[0-9A-Fa-f]+);/n) do
match = $1.dup
case match
when 'amp' then '&'
when 'quot' then '"'
when 'gt' then '>'
when 'lt' then '<'
when /\A#0*(\d+)\z/n then
if Integer($1) < 256
Integer($1).chr
else
if Integer($1) < 65536 and ($KCODE[0] == ?u or $KCODE[0] == ?U)
[Integer($1)].pack("U")
else
"&##{$1};"
end
end
when /\A#x([0-9a-f]+)\z/ni then
if $1.hex < 256
$1.hex.chr
else
if $1.hex < 65536 and ($KCODE[0] == ?u or $KCODE[0] == ?U)
[$1.hex].pack("U")
else
"&#x#{$1};"
end
end
else
"&#{match};"
end
end
end
[/code]

[b]3,html_escape/h做HTML的escape,url_encode/u做URL的encode[/b]
参加Ruby库中的erb.rb
ActionView::Base include了ERB::Util,所以可以直接在html.erb里调用h和u方法
[code]
def html_escape(s)
s.to_s.gsub(/&/, "&").gsub(/\"/, """).gsub(/>/, ">").gsub(/</, "<")
end
alias h html_escape

def url_encode(s)
s.to_s.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
end
alias u url_encode
[/code]

[b]4,JavaScript中escape/unescape做HTML的escape,encodeURI/decodeURI做URL的encode/decode[/b]
[code]
var a = "<span>afd adf &&& <<< >>></span>"
var b = escape(a)
=> "%3Cspan%3Eafd%20adf%20%26%26%26%20%3C%3C%3C%20%3E%3E%3E%3C/span%3E"
var c = unescape(b)
=> "<span>afd adf &&& <<< >>></span>"

var a = "http://www.test.com/haha hehe/"
var b = encodeURI(a)
=> "http://www.test.com/haha%20hehe/"
var c = decodeURI(b)
=> "http://www.test.com/haha hehe/"
[/code]

[b]5,jQuery中的text(str)和html(str)[/b]
jQuery中text(str)方法给某个HTML Element设置文本内容,其中的文本如果包括HTML Tag或者<script>标签都会忽略而当作文本来看待
jQuery中html(str)方法给某个HTML Element设置html内容,其中的内容如果包括HTML Tag或者<script>标签则都会当作正常标签来执行

[b]6,JavaScript实现h和uh方法来escape/unescape HTML[/b]
该方法用于JavaScript拼接HTML片段时防止&、<、>、"相关的问题
[code]
function escapeHTML(str) {
str = String(str).replace(/&/g, '&').
replace(/>/g, '>').
replace(/</g, '<').
replace(/"/g, '"');
return str;
}
function unescapeHTML(str) {
str = String(str).replace(/>/g, '>').
replace(/</g, '<').
replace(/"/g, '"').
replace(/&/g, '&');
return str;
}
h = escapeHTML;
uh = unescapeHTML;
[/code]

有了这些helper方法,基本上能满足99%的URL、HTMLJavaScript的escape和encode方面的需求

http://www.niftyadmin.cn/n/727093.html

相关文章

产品经理——怎么去推进项目

项目进度问题一般在一个小团队中不会表现的特别突出&#xff0c;因为团队人数少&#xff0c;目标一致&#xff0c;沟通成本低&#xff0c;相对于好管理。 但当团队规模扩大到上百人时&#xff0c;项目大且较复杂&#xff0c;任务会被拆分给到更多的人去做&#xff0c;原来的简…

用js对纯静态网页内容分页

现在比较崇尚做纯静态页面的网站&#xff0c;原因是有利于搜索引擎收录。zblog也是将动态更新的文章生成静态页面输出&#xff0c;非常有利于搜索引擎优化。不过有一点不足的地方&#xff0c;zblog不支持文章自动分页。 我们可以通过js代码实现静态网页的自动分页功能&#xff…

作为产品经理,什么能力最重要?

产品经理最重要的能力不是某一项技能&#xff0c;而是让正确的事情相继发生。产品经理是在任何行业、任何场景通、过任何方式解决问题的人。那么具备什么样能力的产品经理&#xff0c;才会成为一名优秀的产品经理&#xff0c;并长远的取得成就&#xff1f; 1、需求的挖掘和分…

WinXP下搭建适合Nokia开发的J2ME环境

说明&#xff0c;最近丢掉了4年前买的Moto L7手机&#xff0c;换了一个Nokia E72的手机&#xff0c;于是有给自己的手机开发软件的想法了。C之类的语言本人只懂皮毛&#xff0c;所以只好使用Java来开发了。在网上参考了一篇文章之后搭配起来了开发环境&#xff0c;写下这篇文章…

作为一个项目经理,怎样才能有效监控项目执行?

项目管理非常强调以成果为导向。做项目就是要做出所需的、可验证的可交付成果。开始做一个项目或一件事情之前&#xff0c;就应该预想一下项目或事情做完后要取得什么可交付成果&#xff0c;甚至还要预想一下在做项目或事情的过程中要取得什么中间可交付成果。根据这个我们就可…

SQL2008报表三种实现Reporting Service2008匿名访问的方法(转)

实现Reporting Service2008 的匿名访问是件比较费劲的事情&#xff0c;网上提供的方法挺多的&#xff0c;但总结起来起来能用的就三种&#xff1a; 一种通过ReportViewer控件显示报表&#xff0c;在系统中添加一个专用用户&#xff0c;权限限制在浏览级别&#xff0c;然后在代码…

产品经理最痛苦的是什么?

需求分析、产品评审、文档原型输出、测试、数据分析等这些都是产品经理的基本功&#xff0c;有困难&#xff0c;但不是最难的&#xff0c;或者说这些搞不定很难成为高级的产品经理。 “产品经理没说过这个需求”&#xff0c;“产品经理以前是这样说的”&#xff0c;“产品经理…

跨域名(跨服务器)共享SESSION ASP.NET 解决方案

首先&#xff0c;我说的跨域是指: a.myDomain.com b.myDomain.com 这样的域。 如果你想 http://www.abc.com/ http://www.bca.com/ 这样共享SESSION这里暂不讨论(可以编程实现). 第一步&#xff1a;使你的ASP.NET程序使用SQL保存SESSION状态。 实施方案&#xff1a;http://ww…