url参数中有+、空格、=、%、&、#等特殊符号的处理

url参数中有+、空格、=、%、&、#等特殊符号的问题解决?

解决办法:

将这些字符转化成服务器可以识别的字符,对应关系如下:

URL字符转义



+    URL 中+号表示空格                      %2B   

空格 URL中的空格可以用+号或者编码           %20 

/   分隔目录和子目录                        %2F     

?    分隔实际的URL和参数                    %3F     

%    指定特殊字符                           %25     

#    表示书签                               %23     

&    URL 中指定的参数间的分隔符             %26     

=    URL 中指定参数的值                     %3D



看看实例:

<input type="button" value="aaa" id="btn_submit">

<script>

(function(){

	$("#btn_submit").click(function(){

		$.post("index.php/Layout/urlDemo",{

			id:2,

			sex:'&male'

		},function(data){

			console.log("First post:"+data);

			$.post("index.php/Layout/urlDemo?id=2&sex=&male",{},function(data){

				console.log("Second post:"+data);

				$.get("index.php/Layout/urlDemo",{

					id:2,

					sex:'&male'

				},function(data){

					console.log("First get:"+data);

					$.get("index.php/Layout/urlDemo?id=2&sex=&male",{},function(data){

						console.log("Second get:"+data);

					});

				});

			});

		});

	});



})(jQuery);

</script>



PHP中Action:

class LayoutAction extends Action {

	public function urlDemo(){

		//此处PHP并没有执行解码

		echo "id=".$_REQUEST['id'].";性别=".$_REQUEST['sex'];

	}

}

结果如下图1:


url参数中有+、空格、=、%、&、#等特殊符号的处理

转码后:

<script>

(function(){

	$("#btn_submit").click(function(){

		$.post("index.php/Layout/urlDemo",{

			id:2,

			sex:'&male'

		},function(data){

			console.log("First post:"+data);

			

			$.post("index.php/Layout/urlDemo?id=2&sex="+encodeURIComponent('&male'),{},function(data){

				console.log("Second post:"+data);

				$.get("index.php/Layout/urlDemo",{

					id:2,

					sex:'&male'

				},function(data){

					console.log("First get:"+data);

					

					$.get("index.php/Layout/urlDemo?id=2&sex="+encodeURIComponent('&male'),{},function(data){

						console.log("Second get:"+data);

					});

				});

			});

		});

	});

})(jQuery);

</script>

结果如下图2:


url参数中有+、空格、=、%、&、#等特殊符号的处理

jQuery ajax封装的get()和post(),已经对特殊字符"&"等做了处理:

看看如下正则:

rprotocol = /^\/\//,

rquery = /\?/,

rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,

rselectTextarea = /^(?:select|textarea)/i,

rspacesAjax = /\s+/,

rts = /([?&])_=[^&]*/,

rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/;



// try replacing _= if it is there

ret = s.url.replace(rts, "$1_=" + ts);

// if nothing was replaced, add timestamp to the end

s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&": "?") + "_=" + ts: "");

最后附:

javascript 编码和解码函数:



1)encodeURI():

a>主要用于整个URI

b>对空格进行编码

c>不会对本身属于URI的特殊字符进行编码,例如":","/","?","#"



2)encodeURIComponent():

a>主要用于URI中的某一段

b>会对发现的任何非标准字符进行编码



3)escape():

a>不会对 ASCII 字母和数字进行编码,

b>不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 

c>其他所有的字符都会被转义序列替换。

d>ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。

<script type="text/javascript">

//Visit%20W3@@@School%21

console.log(escape("Visit W3@@@School!"));

//%3F%21%3D%28%29%23%25%26

console.log(escape("?!=()#%&"))

</script>


 

 

你可能感兴趣的:(url)