gdbots/common-php

View on GitHub
src/Common/Util/URLUtils.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php

namespace Gdbots\Common\Util;

final class URLUtils
{
    // REGEX FROM: http://immike.net/blog/2007/04/06/5-regular-expressions-every-web-programmer-should-know/
    // UPDATED ON 5-21-2010 FROM: http://data.iana.org/TLD/tlds-alpha-by-domain.txt
    const URL_MATCH = "\b
          (?:
            (?:https?):\/\/[-\w]+(?:\.\w[-\w]*)+
          |
            (?i: [a-z0-9] (?:[-a-z0-9]*[a-z0-9])? \. )+
            (?-i:
                  ac\b
                | ad\b
                | ae\b
                | aero\b
                | af\b
                | ag\b
                | ai\b
                | al\b
                | am\b
                | an\b
                | ao\b
                | aq\b
                | ar\b
                | arpa\b
                | as\b
                | asia\b
                | at\b
                | au\b
                | aw\b
                | ax\b
                | az\b
                | ba\b
                | bb\b
                | bd\b
                | be\b
                | bf\b
                | bg\b
                | bh\b
                | bi\b
                | biz\b
                | bj\b
                | bm\b
                | bn\b
                | bo\b
                | br\b
                | bs\b
                | bt\b
                | bv\b
                | bw\b
                | by\b
                | bz\b
                | ca\b
                | cat\b
                | cc\b
                | cd\b
                | cf\b
                | cg\b
                | ch\b
                | ci\b
                | ck\b
                | cl\b
                | cm\b
                | cn\b
                | co\b
                | com\b
                | coop\b
                | cr\b
                | cu\b
                | cv\b
                | cx\b
                | cy\b
                | cz\b
                | de\b
                | dj\b
                | dk\b
                | dm\b
                | do\b
                | dz\b
                | ec\b
                | edu\b
                | ee\b
                | eg\b
                | er\b
                | es\b
                | et\b
                | eu\b
                | fi\b
                | fj\b
                | fk\b
                | fm\b
                | fo\b
                | fr\b
                | ga\b
                | gb\b
                | gd\b
                | ge\b
                | gf\b
                | gg\b
                | gh\b
                | gi\b
                | gl\b
                | gm\b
                | gn\b
                | gov\b
                | gp\b
                | gq\b
                | gr\b
                | gs\b
                | gt\b
                | gu\b
                | gw\b
                | gy\b
                | hk\b
                | hm\b
                | hn\b
                | hr\b
                | ht\b
                | hu\b
                | id\b
                | ie\b
                | il\b
                | im\b
                | in\b
                | info\b
                | int\b
                | io\b
                | iq\b
                | ir\b
                | is\b
                | it\b
                | je\b
                | jm\b
                | jo\b
                | jobs\b
                | jp\b
                | ke\b
                | kg\b
                | kh\b
                | ki\b
                | km\b
                | kn\b
                | kp\b
                | kr\b
                | kw\b
                | ky\b
                | kz\b
                | la\b
                | lb\b
                | lc\b
                | li\b
                | lk\b
                | lr\b
                | ls\b
                | lt\b
                | lu\b
                | lv\b
                | ly\b
                | ma\b
                | mc\b
                | md\b
                | me\b
                | mg\b
                | mh\b
                | mil\b
                | mk\b
                | ml\b
                | mm\b
                | mn\b
                | mo\b
                | mobi\b
                | mp\b
                | mq\b
                | mr\b
                | ms\b
                | mt\b
                | mu\b
                | museum\b
                | mv\b
                | mw\b
                | mx\b
                | my\b
                | mz\b
                | na\b
                | name\b
                | nc\b
                | ne\b
                | net\b
                | nf\b
                | ng\b
                | ni\b
                | nl\b
                | no\b
                | np\b
                | nr\b
                | nu\b
                | nz\b
                | om\b
                | org\b
                | pa\b
                | pe\b
                | pf\b
                | pg\b
                | ph\b
                | pk\b
                | pl\b
                | pm\b
                | pn\b
                | pr\b
                | pro\b
                | ps\b
                | pt\b
                | pw\b
                | py\b
                | qa\b
                | re\b
                | ro\b
                | rs\b
                | ru\b
                | rw\b
                | sa\b
                | sb\b
                | sc\b
                | sd\b
                | se\b
                | sg\b
                | sh\b
                | si\b
                | sj\b
                | sk\b
                | sl\b
                | sm\b
                | sn\b
                | so\b
                | sr\b
                | st\b
                | su\b
                | sv\b
                | sy\b
                | sz\b
                | tc\b
                | td\b
                | tel\b
                | tf\b
                | tg\b
                | th\b
                | tj\b
                | tk\b
                | tl\b
                | tm\b
                | tn\b
                | to\b
                | tp\b
                | tr\b
                | travel\b
                | tt\b
                | tv\b
                | tw\b
                | tz\b
                | ua\b
                | ug\b
                | uk\b
                | us\b
                | uy\b
                | uz\b
                | va\b
                | vc\b
                | ve\b
                | vg\b
                | vi\b
                | vn\b
                | vu\b
                | wf\b
                | ws\b
                | xn\b
                | ye\b
                | yt\b
                | za\b
                | zm\b
                | zw\b
                | [a-z][a-z]\.[a-z][a-z]\b
            )
          )

          (?: : \d+ )?

          (?:
            \/
            [^?;\"<>\[\]\{\}\s\x7F-\xFF]*
            (?:
                  [\.!,?]+ [^?;\"<>\[\]\{\}\s\x7F-\xFF]+
            )*
          )?";

    /**
     * Private constructor. This class is not meant to be instantiated.
     */
    private function __construct()
    {
    }

    /**
     * Determines if $string is a URL
     *
     * @param string $string The string to analyze
     *
     * @return boolean Returns TRUE if the string passed in is a url
     */
    public static function isUrl($string)
    {
        return preg_match('/' . self::URL_MATCH . '/ix', $string);
    }

    /**
     * Outputs a "safe" url, stripped of xss, autolink on domain, and stripped of invalid chars
     *
     * @param string $url The url to process
     *
     * @return string Safe and happy URL
     */
    public static function safeUrl($url)
    {
        if (empty($url)) {
            return '';
        }

        // Prepend http:// if no scheme is specified
        if (!preg_match("/^(https?):\/\//", $url))
            $url = 'http://' . $url;

        if (!self::isURL($url)) {
            return '';
        }

        return filter_var($url, FILTER_SANITIZE_URL);
    }
}