[![Build Status](https://travis-ci.org/amogil/url_regex.svg?branch=master)](https://travis-ci.org/amogil/url_regex) [![Code Climate](https://codeclimate.com/github/amogil/url_regex/badges/gpa.svg)](https://codeclimate.com/github/amogil/url_regex) [![Gem Version](https://badge.fury.io/rb/url_regex.svg)](https://badge.fury.io/rb/url_regex) [![Dependency Status](https://gemnasium.com/badges/github.com/amogil/url_regex.svg)](https://gemnasium.com/github.com/amogil/url_regex) # UrlRegex Provides the best known regex for validating and extracting URLs. It builds on amazing work done by [Diego Perini](https://gist.github.com/dperini/729294) and [Mathias Bynens](https://mathiasbynens.be/demo/url-regex). Why do we need a gem for this regex? - You don't need to follow changes and improvements of original regex. - You can slightly customize the regex: a scheme can be optional, and you can get the regex for validation or parsing. ## Installation Add this line to your application's Gemfile: gem 'url_regex' And then execute: $ bundle Or install it yourself as: $ gem install url_regex ## Usage Get the regex: UrlRegex.get(options) where options are: - `scheme_required` indicates that schema is required, defaults to `true`. - `mode` can gets either `:validation`, `:parsing` or `:javascript`, defaults to `:validation`. `:validation` asks to return the regex for validation, namely, with `\A` prefix, and with `\z` postfix. That means, it matches whole text: UrlRegex.get(mode: :validation).match('https://www.google.com').nil? # => false UrlRegex.get(mode: :validation).match('link: https://www.google.com').nil? # => true `:parsing` asks to return the regex for parsing: str = 'links: google.com https://google.com?t=1' str.scan(UrlRegex.get(mode: :parsing)) # => ["https://google.com?t=1"] # schema is not required str.scan(UrlRegex.get(scheme_required: false, mode: :parsing)) # => ["google.com", "https://google.com?t=1"] `:javascript` asks to return the regex formatted for use in Javascript files or as `pattern` attribute values on HTML inputs. For this purpose, you'd use the `source` method on the Regexp object instance in order to produce a string that Javascript will understand. These examples make use of the Rails `text_field` method to generate HTML input elements. regex = UrlRegex.get(mode: :javascript) text_field(:site, :url, pattern: regex.source) # => regex = UrlRegex.get(scheme_required: false, mode: :javascript) text_field(:site, :url, pattern: regex.source) # => `UrlRegex.get` returns regular Ruby's [Regex](http://ruby-doc.org/core-2.0.0/Regexp.html) object, so you can use it as usual. All regexes are case-insensitive. ## FAQ Q: Hey, I want to parse HTML, but it doesn't work: str = 'Link' str.scan(UrlRegex.get(mode: :parsing)) # => "http://google.com?t=1">Link" A: Well, you probably know that parsing HTML with regex is [a bad idea](https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags). It requires matching corresponding open and close brackets, that makes the regex even more complicated. Q: How can I speed up processing? A: Generated regex depends only on options, so you can get the regex only once and cache it. ## Contributing 1. Fork it ( https://github.com/[my-github-username]/url_regex/fork ) 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Add some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create a new Pull Request