我正在使用JavaScript .split()
来分割网址参数。
当且仅当它存在于字母数字字符旁边时,是否可以使用正则表达式来捕获&
的匹配项?
示例:
不匹配: ?category=Health+&+Wellness
匹配
?category=Health&Wellness
首先匹配,匹配第二个: ?category=Health+&+Wellness&tag=Diet
我正在使用一个脚本,该脚本从我的网页模板中的data-url
属性中提取网址中的参数。这是参数脚本的部分片段。
var query = decodeURIComponent( str ).match( /[#|?].*$/g ),
ret = {};
if ( query ) {
query = query[ 0 ].replace( /^\?|^#|^\/|\/$|\[|\]/g, "" );
query = query.split( "&" );
for ( var i = query.length; i--; ) {
var pair = query[ i ].split( "=" ),
key = pair[ 0 ],
val = pair[ 1 ];
if ( ret[ key ] ) {
if ( {}.toString.call( ret[ key ] ) !== "[object Array]" ) {
ret[ key ] = [ ret[ key ] ];
}
ret[ key ].push( val );
} else {
ret[ key ] = val;
}
}
}
我当前代码的问题出在split()
行。现在它拆分了像Health+&+Wellness
这样的参数,我不想这样做。
答案 0 :(得分:0)
可能的解决方案,预格式化uri:
var query = decodeURIComponent( str ).replace(/&([^&=]+(&[^&=]+=|$))/, '%26$1');
结果:
> query = "?category=Health+&+Wellness&tag=Diet"
> query.replace(/&([^&=]+(&[^&=]+=|$))/, '%26$1')
< "?category=Health+%26+Wellness&tag=Diet"
注意:我强烈建议您调试代码并查看str
之前decodeURIComponent
的内容{-1}}
> str
< "?category=Health+%26+Wellness&tag=Diet" // no &
> decodeURIComponent(str)
< "?category=Health+&+Wellness&tag=Diet" // & instead of %26
所以,有可能的,uri conponents必须是decodeURIComponent
- 之后split('&')
分开
答案 1 :(得分:0)
分割后,不要仅在键和值上调用整个字符串上的decodeURIComponent:
var query = str.match( /[#|?].*$/g ),
ret = {};
if ( query ) {
query = query[ 0 ].replace( /^\?|^#|^\/|\/$|\[|\]/g, "" );
query = query.split( "&" );
for ( var i = query.length; i--; ) {
var pair = query[ i ].split( "=" ),
key = decodeURIComponent( pair[ 0 ] ),
val = decodeURIComponent( pair[ 1 ] );
if ( ret[ key ] ) {
if ( {}.toString.call( ret[ key ] ) !== "[object Array]" ) {
ret[ key ] = [ ret[ key ] ];
}
ret[ key ].push( val );
} else {
ret[ key ] = val;
}
}
}