widont regex

JavaScript performance comparison

Test case created

Preparation code

Benchmark.prototype.setup = function() {
    str = '<p>Testing with <strong>multiple inline</strong> tags at <a href="#"><strong><em>the end</em></strong></a>.</p>';
    re = function (regexp, flag) {
      return new RegExp(regexp, flag);
    var widont1 = function(text) {
        var re_widont = re(
                '((?:</?(?:a|em|span|strong|i|b)[^>]*>)|'+  // must be proceeded by an approved
                    '[^<>\\s])'+                      // inline opening or closing tag or
                                                      // a nontag/nonspace
                '\\s+'+                               // the space to replace
                '([^<>\\s]+'+                         // must be flollowed by non-tag
                                                      // non-space characters
                '\\s*'+                               // optional white space!
                '(</(a|em|span|strong|i|b)>|\\s*|\\.*)*'+   // optional closing inline tags with
                                                      // optional white space after each
                '((</(p|h[1-6]|li|dt|dd)>)|$))'       // end with a closing p, h1-6, li or
                                                      // the end of the string
                , 'gi');
        return text.replace(re_widont, '$1&nbsp;$2');
    var widont2 = function(text) {
            var re_widont = re(
              '(\\w)'+                                                 // a word boundry character, matching group 1
              '(?:\\s+)'+                                              // one or more space characters
              '('+                                                     // matching group 2
                '[^<>\\s]+'+                                           // nontag/nonspace characters
                '(?:\\s*</(?:a|em|span|strong|i|b)[^>]*?>\\s*\\.*)*?'+ // one or more inline closing tags
                                                                       // can be surronded by spaces
                                                                       // and followed by a period.
                '(?:\\s*?</(?:p|h[1-6]|li|dt|dd)>|$)'+                 // allowed closing tags or end of line
              ')', 'gi');
        return text.replace(re_widont, '$1&nbsp;$2');

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
original regex
new regex

You can edit these tests or add even more tests to this page by appending /edit to the URL.

Compare results of other browsers


Add a comment