Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/amogil/url_regex

Provides the best regex for validating or extracting URLs
https://github.com/amogil/url_regex

extract-urls parsing regexes ruby ruby-gem rubygem

Last synced: about 1 month ago
JSON representation

Provides the best regex for validating or extracting URLs

Awesome Lists containing this project

README

        

[![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)

# 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