2

这个问题与如何使用 jquery 将插入符号后的数字转换为上标有关,我得到了一个很好的答案

现在问题,我需要扩展最近的脚本 | jsfiddle,以便它考虑连续的数字。

最近的脚本接受一个字符串,并检查它的插入符号。然后:

  1. 如果插入符号后面没有括号,则只为下一个字符上标。x^2变成x<sup>2</sup>
  2. 如果有左括号,则上标直到右括号。x^(2y+1)变成x<sup>2y+1</sup>

但是,我需要扩展 n°1,因为可能有一个数字包含几个数字甚至variables

所以我们需要一个新的n°1:

  1. 如果插入符号后面没有括号,只要是数字或字符,就为所有连续字符上标。这样x^12a就变成了x<sup>12a</sup>

我试图实现它,包括一个变量afternext = input[ (i+1) ])并通过存储它来检查这个字符if(afternext.match(/^[0-9a-zA-Z]+$/)) { ... },但我失败了:(

因此,如果今天有人感觉足够健康,我很高兴看到您的解决方案。

谢谢你。

4

1 回答 1

2

给你,先生。我对其进行了一些重构以使用内部循环而不是缓冲区数组,因为它与额外的缓冲条件有点混乱。

// transform carets, e.g. x^2 to x<sup>2</sup> and x^(2y) to x<sup>2y</sup>
function superify(input) {
    if(!input) return input;
    var output = [];
    var alphanumeric = /^[a-z0-9]+$/i;
    var i = 0;
    var parens;

    //outer loop for iterating string
    while(i < input.length) {
        var current = input[i++];
        var next    = input[i];

        if(current === '^' && next && ((parens = (next === '(')) || next.match(alphanumeric))) {

            var first = next;

            //start super
            output.push('<sup>');
            if(!parens) 
                output.push(first);

            //push chars to output until break or string end
            while(i++ < input.length) {
                current = input[i];
                if(parens && current === ')')
                    break;
                if(!parens && !current.match(alphanumeric))
                    break;
                output.push(current);
            }

            output.push('</sup>');
            if(!parens) 
                output.push(current);
            i++;
        }
        else {
            output.push(current);
        }
    }

    return output.join('');
}
于 2013-02-12T15:12:31.163 回答