如何检测字符的第二次出现

How to detect 2nd appearance of character?

本文关键字:第二次 字符 何检测 检测      更新时间:2023-09-26

我正在尝试使用JavaScript向MediaWiki聊天添加工具箱。好吧,用这段代码,我对另一个MediaWiki页面(MediaWiki:Chat-herramientas-2)进行AJAX请求,以获取工具箱的内容,并在聊天中打印它。

工具箱内容的格式为:

- Navigation
 * Page 1
 * Page 2
 * Page 3|Hahaha
 * #|Execute script|hello()

第一行是第一个<<ul>(工具箱)。它具有类"active"。

第二行和第三行分别为"<a>"和href"#",文本分别为"第1页"answers"第2页"。

第四行有一个href,url为"…/第3页",文本为"哈哈哈"。

但在第五行中,我想插入一个空白href("#"),文本为"执行脚本",在第二行"|"之后添加带有"hello()"的onclick属性。

我无法完成,因为我不知道如何检测角色的第二次出现。完整的代码是:

$(function() {
    var $chatheader = $('#ChatHeader');
    select = 'MediaWiki:Chat-herramientas-2';
    var $menu = $('<ul class="dropdown"></ul>')
    .insertAfter($chatheader)
    function flatten (options, indent) {
        var flattened = [];
        indent = indent || '';
        for (var i = 0; i < options.length; i++) {
            if ($.isArray(options[i])) {
                flattened = flattened.concat(flatten(options[i], '* '));
            } else {
                flattened.push(indent + options[i]);
            }
        }
        return flattened;
    }
    function render (lines) {
        var options = '', selected = ' selected',
            ignore = { '(': 1, ':': 1,  '<': 1 };
        for (var i = 0; i < lines.length; i++, selected = '') {
            if (!lines[i].length || ignore[lines[i][0]]) {
                continue;
            }
            var contents = mw.html.escape( lines[i].substring(2) );
            if (lines[i].substring(0, 2) === '* ') {
                var clase = contents.replace(/[^a-z0-9's]/gi, '').replace(/[_'s]/g, '-').toLowerCase();
                var url = contents.replace(/[^a-z0-9's]/gi, '').replace(/[_'s]/g, '-').toLowerCase();
                var checksitiene = /'|/g.test(contents)
                if(checksitiene) {
                    var wachem = contents.replace(/'|/,'">');
                    options += '<li class="' + clase + '"' +
                        selected + '><a target="_blank" href="/wiki/' + wachem + '</a></li>';
                } else {
                options += '<li class="' + clase + '"' +
                    selected + '><a href="#">' + contents + '</a></li>';
                }
            } else {
                options += '<li class="active">' + contents + ' <span>▼</span></li>';
            }
        }
        $menu.append(options);
    }
    if (typeof select === 'string') {
        $.get('/wiki/' + select + '?action=raw&ctype=text/javascript')
        .done(function (data) {
            render(data.split(/'r'n|'n|'r/));
        });
    } else if ($.isArray(select)) {
        render(flatten(select));
    }
});

String.prototype.indexOf接受两个参数,第一个是要匹配的字符串,第二个是开始匹配的索引。请参阅MDN。

因此,在使用indexOf查找字符串的第一个实例后,您可以从该索引+(匹配字符串的长度)中搜索以查找下一个匹配项。

一个可以多次调用以接收字符串中下一个索引的函数:

function makeIndexer(text,pattern,start){
  start = start||0;
  var patternLength = pattern.length
    , initialStart = start
    ;
  return function(){
    var index = text.indexOf(pattern,start);
    if(index === -1){ //start over from initial start index after we reach the end
      start = initialStart;
    }else{
      start = index + patternLength;
    }
    return index;
  }
}

然后这样使用:

var nextIndex = makeIndexer("Wow, what an awesome function!","w")
nextIndex() //2 still case sensitive like indexOf
nextIndex() //5
nextIndex() //14
nextIndex() //-1 Like indexOf, returns -1 when there are no more matches
nextIndex() //2 starting over