如何使用jquery将插入符号后的连续数字转换为上标?

时间:2013-02-12 13:39:38

标签: jquery text superscript

这个问题与我How to convert numbers after caret to superscript with jquery非常good answer有关。

现在问题,我需要扩展recent script | jsfiddle,以便将连续的数字考虑在内。

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

  1. 如果插入符号后面没有括号,则只标注下一个字符。 x^2变为x<sup>2</sup>
  2. 如果有一个开口支架,则上标直到收盘。 x^(2y+1)变为x<sup>2y+1</sup>
  3. 但是,我需要扩展n°1,因为可能有一个数字包含几个数字甚至变量

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

    1. 如果插入符号后面没有括号,则上标所有连续字符,只要它们是数字或字符。因此x^12a变为x<sup>12a</sup>
    2. 我尝试实现它,包括变量afternext = input[ (i+1) ])并通过if(afternext.match(/^[0-9a-zA-Z]+$/)) { ... }存储它来检查此char,但我失败了:(

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

      谢谢。

1 个答案:

答案 0 :(得分:2)

Here you go, sir。我重构了一下使用内部循环而不是缓冲区数组,因为它对于额外的缓冲条件有点麻烦。

// 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('');
}