'use strict' // TODO: Create Unittests that test all functions // We return new regexes everytime as opposed to using a constant regex because // regexes with the global flag maintain internal iterators that can cause problems: // http://bjorn.tipling.com/state-and-regular-expressions-in-javascript // http://www.2ality.com/2013/08/regexp-g.html export function getEmailRegex() { // This is a bit of a weak test for an email, but you really can't win them all // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address return /.*@.*\..*/g; } export function getLinkRegex() { // You really can't win them all with urls too (unless a 500 character regex that adheres // to a strict interpretation of urls sounds like fun!) // https://mathiasbynens.be/demo/url-regex // // This was initially based off of the one angular uses for its linky // (https://github.com/angular/angular.js/blob/master/src/ngSanitize/filter/linky.js)... // but then it evovled into its own thing to support capturing groups for filtering the // hostname and other technically valid urls. // // Capturing groups: // 1. URL scheme // 2. URL without scheme // 3. Host name // 4. Path // 5. Fragment // // Passes most tests of https://mathiasbynens.be/demo/url-regex, but provides a few false // positives for some tests that are too strict (like `foo.com`). There are a few other // false positives, such as `http://www.foo.bar./` but c'mon, that one's not my fault. // I'd argue we would want to match that as a link anyway. // // Note: This also catches emails, as otherwise it would match the `ascribe.io` in `hi@ascribe.io`, // producing (what I think is) more surprising behaviour than the alternative. return /\b(https?:\/\/)?((?:www\.)?((?:[^\s.,;()\/]+\.)+[^\s$_!*()$&.,;=?+\/\#]+)((?:\/|\?|\/\?)[^\s#^`{}<>?"\[\]\/\|]+)*\/?(#[^\s#%^`{}<>?"\[\]\/\|]*)?)/g; } /** * @param {string} string String to check * @return {boolean} Whether string is an email or not */ export function isEmail(string) { return !!string && string.match(getEmailRegex()); } /** * @param {string} string String to check * @return {boolean} Whether string is an link or not */ export function isLink(string) { return !!string && string.match(getLinkRegex()); }