在数字/数字和字母/字符之间添加空格

时间:2012-11-02 08:28:55

标签: javascript split space digits letters

我有这样的代码

(function($, window, document, undefined) {
    $.fn.quicksearch = function (target, opt) {

        var timeout, cache, rowcache, jq_results, val = '', e = this, options = $.extend({ 
            delay: 100,
            selector: null,
            stripeRows: null,
            loader: null,
            noResults: '',
            bind: 'keyup',
            onBefore: function () { 
                return;
            },
            onAfter: function () { 
                return;
            },
            show: function () {
                this.style.display = "";
            },
            hide: function () {
                this.style.display = "none";
            },
            prepareQuery: function (val) {
                return val.toLowerCase().split(' ');
            },
            testQuery: function (query, txt, _row) {
                for (var i = 0; i < query.length; i += 1) {
                    if (txt.indexOf(query[i]) === -1) {
                        return false;
                    }
                }
                return true;
            }
        }, opt);

        this.go = function () {

            var i = 0, 
            noresults = true, 
            query = options.prepareQuery(val),
            val_empty = (val.replace(' ', '').length === 0);

            for (var i = 0, len = rowcache.length; i < len; i++) {
                if (val_empty || options.testQuery(query, cache[i], rowcache[i])) {
                    options.show.apply(rowcache[i]);
                    noresults = false;
                } else {
                    options.hide.apply(rowcache[i]);
                }
            }

            if (noresults) {
                this.results(false);
            } else {
                this.results(true);
                this.stripe();
            }

            this.loader(false);
            options.onAfter();

            return this;
        };

        this.stripe = function () {

            if (typeof options.stripeRows === "object" && options.stripeRows !== null)
            {
                var joined = options.stripeRows.join(' ');
                var stripeRows_length = options.stripeRows.length;

                jq_results.not(':hidden').each(function (i) {
                    $(this).removeClass(joined).addClass(options.stripeRows[i % stripeRows_length]);
                });
            }

            return this;
        };

        this.strip_html = function (input) {
            var output = input.replace(new RegExp('<[^<]+\>', 'g'), "");
            output = $.trim(output.toLowerCase());
            return output;
        };

        this.results = function (bool) {
            if (typeof options.noResults === "string" && options.noResults !== "") {
                if (bool) {
                    $(options.noResults).hide();
                } else {
                    $(options.noResults).show();
                }
            }
            return this;
        };

        this.loader = function (bool) {
            if (typeof options.loader === "string" && options.loader !== "") {
                 (bool) ? $(options.loader).show() : $(options.loader).hide();
            }
            return this;
        };

        this.cache = function () {

            jq_results = $(target);

            if (typeof options.noResults === "string" && options.noResults !== "") {
                jq_results = jq_results.not(options.noResults);
            }

            var t = (typeof options.selector === "string") ? jq_results.find(options.selector) : $(target).not(options.noResults);
            cache = t.map(function () {
                return e.strip_html(this.innerHTML);
            });

            rowcache = jq_results.map(function () {
                return this;
            });

            return this.go();
        };

        this.trigger = function () {
            this.loader(true);
            options.onBefore();

            window.clearTimeout(timeout);
            timeout = window.setTimeout(function () {
                e.go();
            }, options.delay);

            return this;
        };

        this.cache();
        this.results(true);
        this.stripe();
        this.loader(false);

        return this.each(function () {
            $(this).bind(options.bind, function () {
                val = $(this).val();
                e.trigger();
            });
        });

    };

}(jQuery, this, document));

我试着找出在数字和字母之间分割/添加空格的位置和方式。导致某些人输入例如“ip1500”并且脚本无法使用类似“ip 1500”的元素匹配输入。我的问题是我是初学者。

我正在努力尝试,但我无法让它发挥作用。我也试过了this

我找到了这个地方,我认为可以在这里完成所有东西被“”(空格)拆分:

prepareQuery: function (val) {
    return val.toLowerCase().split(' ');
    }, 

如果有人可以帮助我,那将是非常好的。

2 个答案:

答案 0 :(得分:6)

如果你想要“123abc345def”到“123 abc 345 def”。替换功能可能会有所帮助。代码是这样的。

var str = "123abc345def";
str = str.replace(/(\d+)/g, function (_, num){
    console.log(num);
    return ' ' + num + ' ';
});
str = str.trim();

答案 1 :(得分:2)

您链接的代码不起作用主要是因为它使用不同的编程语言来实现javascript。理论上,它应该工作,但javascript不支持正则表达式lookbehinds(目前)...

相反,我重写了这段代码:

prepareQuery: function (val) {
function isNotLetter(a){
return (/[0-9-_ ]/.test(a));
}

var val=val.toLowerCase().split("");
var tempArray=val.join("").split("");
var currentIndex=1;

for (var i=0;i<val.length-1;i++){
if (isNotLetter(val[i]) !== isNotLetter(val[i+1])){
tempArray.splice(i+currentIndex, 0, " ");
currentIndex++;
}
}
return tempArray.join("");
}

由于你是javascript的新手,我将解释它的作用。

  1. 它在prepareQuery中声明了一个函数,用于检查字符串是否包含字母[可以将其移动到其他地方]
  2. 然后将val拆分为数组,并将val的内容复制到tempArray
  3. 声明索引(稍后解释)
  4. 制作一个循环,遍历val
  5. 中的每个字符
  6. if语句检测当前字符(由循环设置的val[i])是否与其旁边的字符(val[i+1])相同。
  7. 如果其中一个与另一个不同(即当前字符是字母而下一个字母不是),则在该“索引”处将tempArray添加一个空格
  8. 索引递增并用作#6
  9. 中的偏移量
  10. 循环结束,将“数组”连接成一个字符串并输出结果。
  11. 样本: http://jsbin.com/ebitus/1/edit (JSFiddle失败了......)

    修改 对不起,但我完全误解了你的问题...你没有提到你使用的是“quicksearch”和jQuery。在这种情况下,我假设您有一个包含名称的元素列表,并且您希望使用插件搜索它们... 匹配用户查询(如果没有空间)的更简单的方法是从搜索表中删除空间以及查询本身 - 尽管原始的反向方法将起作用(只是效率不高)[又名:扩展用户的查询]

    在这种情况下,从搜索表和用户输入中剥离空间将是更好的方法

        prepareQuery: function (val) {
            return val.toLowerCase().replace(/ /ig,'').split(" ");
        },
        testQuery: function (query, txt, _row) {
            txt=txt.toLowerCase().replace(/ /ig,'');
        for (var i = 0; i < query.length; i += 1) {
            if (txt.indexOf(query[i]) === -1) {
                return false;
            }
        }
        return true;
    

    }

    样本: http://jsfiddle.net/q9k9Y/3/

    编辑2:

    您的真正意图似乎是在网站上创建功能齐全的搜索功能,而不仅仅是在字母和数字之间添加空格。有了这个,我建议使用Quicksilver。我想制定一个算法来扩展quickSearcher但是目前我不能(时区)。相反,我建议使用Quicksilver

    http://jsbin.com/oruhet/12/