正则表达式:匹配“&”只有在字母数字字符旁边

时间:2016-02-17 09:32:41

标签: javascript regex string split url-parameters

我正在使用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这样的参数,我不想这样做。

2 个答案:

答案 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;
            }
        }
    }