You are here

function _block_titlelink_validate_url in Block Title Link 7

Same name and namespace in other branches
  1. 8 block_titlelink.module \_block_titlelink_validate_url()
  2. 6.2 block_titlelink.module \_block_titlelink_validate_url()

Heisted the url validation from the link field module.

1 call to _block_titlelink_validate_url()
block_titlelink_form_validate in ./block_titlelink.module
Implementation of hook_validate()

File

./block_titlelink.module, line 249
module for adding a link to a block title

Code

function _block_titlelink_validate_url($url) {
  $text = $url;

  // These constants were heisted from the field_module.
  // Check if they exist
  if (!defined('LINK_EXTERNAL')) {
    define('LINK_EXTERNAL', 'external');
  }
  if (!defined('LINK_INTERNAL')) {
    define('LINK_INTERNAL', 'internal');
  }
  if (!defined('LINK_FRONT')) {
    define('LINK_FRONT', 'front');
  }
  if (!defined('LINK_EMAIL')) {
    define('LINK_EMAIL', 'email');
  }
  if (!defined('LINK_NEWS')) {
    define('LINK_NEWS', 'news');
  }
  if (!defined('LINK_DOMAINS')) {
    define('LINK_DOMAINS', 'aero|arpa|asia|biz|com|cat|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|mobi|local');
  }
  $LINK_ICHARS_DOMAIN = (string) html_entity_decode(implode("", array(
    "æ",
    // æ
    "Æ",
    // Æ
    "ø",
    // ø
    "Ø",
    // Ø
    "å",
    // å
    "Å",
    // Å
    "ä",
    // ä
    "Ä",
    // Ä
    "ö",
    // ö
    "Ö",
    // Ö
    "ü",
    // ü
    "Ü",
    // Ü
    "Ñ",
    // Ñ
    "ñ",
  )), ENT_QUOTES, 'UTF-8');
  $LINK_ICHARS = $LINK_ICHARS_DOMAIN . (string) html_entity_decode(implode("", array(
    "ß",
  )), ENT_QUOTES, 'UTF-8');
  $allowed_protocols = variable_get('filter_allowed_protocols', array(
    'http',
    'https',
    'ftp',
    'news',
    'nntp',
    'telnet',
    'mailto',
    'irc',
    'ssh',
    'sftp',
    'webcal',
  ));
  $protocol = '((' . implode("|", $allowed_protocols) . '):\\/\\/)';
  $authentication = '(([a-z0-9%' . $LINK_ICHARS . ']+(:[a-z0-9%' . $LINK_ICHARS . '!]*)?)?@)';
  $domain = '(([a-z0-9' . $LINK_ICHARS_DOMAIN . ']([a-z0-9' . $LINK_ICHARS_DOMAIN . '\\-_\\[\\]])*)(\\.(([a-z0-9' . $LINK_ICHARS_DOMAIN . '\\-_\\[\\]])+\\.)*(' . LINK_DOMAINS . '|[a-z]{2}))?)';
  $ipv4 = '([0-9]{1,3}(\\.[0-9]{1,3}){3})';
  $ipv6 = '([0-9a-fA-F]{1,4}(\\:[0-9a-fA-F]{1,4}){7})';
  $port = '(:([0-9]{1,5}))';

  // Pattern specific to external links.
  $external_pattern = '/^' . $protocol . '?' . $authentication . '?(' . $domain . '|' . $ipv4 . '|' . $ipv6 . ' |localhost)' . $port . '?';

  // Pattern specific to internal links.
  $internal_pattern = "/^([a-z0-9" . $LINK_ICHARS . "_\\-+\\[\\]]+)";
  $internal_pattern_file = "/^([a-z0-9" . $LINK_ICHARS . "_\\-+\\[\\]\\.]+)\$/i";
  $directories = "(\\/[a-z0-9" . $LINK_ICHARS . "_\\-\\.~+%=& ,\$'!():;*@\\[\\]]*)*";

  // Yes, four backslashes == a single backslash.
  $query = "(\\/?\\?([?a-z0-9" . $LINK_ICHARS . "+_|\\-\\.\\/\\\\%=&,\$'():;*@\\[\\]{} ]*))";
  $anchor = "(#[a-z0-9" . $LINK_ICHARS . "_\\-\\.~+%=& ,\$'():;*@\\[\\]\\/\\?]*)";

  // The rest of the path for a standard URL.
  $end = $directories . '?' . $query . '?' . $anchor . '?' . '$/i';
  $message_id = '[^@].*@' . $domain;
  $newsgroup_name = '([0-9a-z+-]*\\.)*[0-9a-z+-]*';
  $news_pattern = '/^news:(' . $newsgroup_name . '|' . $message_id . ')$/i';
  $user = '[a-zA-Z0-9' . $LINK_ICHARS . '_\\-\\.\\+\\^!#\\$%&*+\\/\\=\\?\\`\\|\\{\\}~\'\\[\\]]+';
  $email_pattern = '/^mailto:' . $user . '@' . '(' . $domain . '|' . $ipv4 . '|' . $ipv6 . '|localhost)' . $query . '?$/';
  if (strpos($text, '<front>') === 0) {
    return LINK_FRONT;
  }
  if (in_array('mailto', $allowed_protocols) && preg_match($email_pattern, $text)) {
    return LINK_EMAIL;
  }
  if (in_array('news', $allowed_protocols) && preg_match($news_pattern, $text)) {
    return LINK_NEWS;
  }
  if (preg_match($internal_pattern . $end, $text)) {
    return LINK_INTERNAL;
  }
  if (preg_match($external_pattern . $end, $text)) {
    return LINK_EXTERNAL;
  }
  if (preg_match($internal_pattern_file, $text)) {
    return LINK_INTERNAL;
  }
  return FALSE;
}