2

I'm trying to transfer the following URL validation function from my PHP code to my javascript code:

   this.validate_url = function(field)
    {
        var pattern = new RegExp("^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?");
        var val = $("#" + field).val();

        return pattern.test(val);
    }

And this gives me the error:

invalid quantifier ?w+=w+)?(&w+=w+)*)?

How can I fix this?

KatieK
  • 13,586
  • 17
  • 76
  • 90
Ali
  • 261,656
  • 265
  • 575
  • 769

2 Answers2

4

You either need to escape the backslashes within the string declaration:

var pattern = new RegExp("^((ht|f)tp(s?)://|~/|/)?(\\w+:\\w+@)?([a-zA-Z]{1}([\\w-]+\\.)+(\\w{2,5}))(:\\d{1,5})?((/?\\w+/)+|/?)(\\w+\\.\\w{3,4})?((\\?\\w+=\\w+)?(&\\w+=\\w+)*)?");

Or you use the regular expression literal syntax /expr/flags:

var pattern = /^((ht|f)tp(s?):\/\/|~\/|\/)?(\w+:\w+@)?([a-zA-Z]{1}([\w-]+\.)+(\w{2,5}))(:\d{1,5})?((\/?\w+\/)+|\/?)(\w+\.\w{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?/;

You should also try to use non-capturing groups (?:expr) where you don’t need to reference the match of that groups.

Gumbo
  • 643,351
  • 109
  • 780
  • 844
3

Since backslash is an escaping character in JavaScript, you'll have to escape that to write it in a string:

var pattern = new RegExp("^((ht|f)tp(s?)\\:\\/\\/|~/|/)?([\\w]+:\\w+@)?([a-zA-Z]{1}([\\w\\-]+\\.)+([\\w]{2,5}))(:[\\d]{1,5})?((/?\\w+/)+|/?)(\\w+\\.[\\w]{3,4})?((\\?\\w+=\\w+)?(&\\w+=\\w+)*)?");
David Hedlund
  • 128,221
  • 31
  • 203
  • 222