Regex для разбора URL PHP - PullRequest
       0

Regex для разбора URL PHP

1 голос
/ 18 августа 2011

Мне нужно выяснить, является ли данный URL действительным или нет, сценарий таков, что его следует разрешить, если он содержит URL, вызывающие изменения

1. Общие домены верхнего уровня 2. Код страны, к которым относятся домены верхнего уровняниже url http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

Мне нужно сделать это на PHP, это то, что я сейчас делаю

    $regexUrl = "((https?|ftp)\:\/\/)?"; // SCHEME 
    $regexUrl .= "([a-zA-Z0-9+!*(),;?&=\$_.-]+(\:[a-zA-Z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass 
    $regexUrl .= "([a-zA-Z0-9-]+)\.([a-zA-Z]{2,3})";  // Host or IP 
    $regexUrl .= "(\:[0-9]{2,5})?"; // Port 
    $regexUrl .= "(\/([a-zA-Z0-9+\$_-]\.?)+)*\/?"; // Path 
    $regexUrl .= "(\?[a-zA-Z+&\$_.-][a-zA-Z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
    $regexUrl .= "(#[a-zA-Z_.-][a-zA-Z0-9+\$_.-]*)?"; // Anchor 
    //if(preg_match_all("#\bhttps?://[^\s()]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#", $message, $matches1, PREG_PATTERN_ORDER))
    //$pattern = '/((https?|ftp)\:(\/\/)|(file\:\/{2,3}))?(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(((([a-zA-Z0-9]+)(\.)?)+)(\.)(com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|[a-z]{2}))([\/][\/a-zA-Z0-9\.]*)*([\/]?(([\?][a-zA-Z0-9]+[\=][a-zA-Z0-9\%\(\)]*)([\&][a-zA-Z0-9]+[\=][a-zA-Z0-9\%\(\)]*)*))?/';
    if(preg_match_all("/$regexUrl/", $urlMessage, $matches1, PREG_PATTERN_ORDER))
    {
      try
        {
            foreach($matches1[0] as $urlToTrim1)
            {
                $url= $urlToTrim1;
                echo $url;
            }
        }
        catch(Exception $e)
        {
            $url="-1";
        }
    }

1 Ответ

6 голосов
/ 18 августа 2011

Чтобы выяснить, является ли это действительный URL-адрес:

filter_var($url, FILTER_VALIDATE_URL)

http://www.php.net/manual/en/function.filter-var.php

Если вы хотите подтвердить, что ДВУ входит в ваш утвержденный список (я не знаю, зайдет ли filter_var настолько, чтобы проверить, действительно ли ДВУ существует):

$host = parse_url($url, PHP_URL_HOST);
$tld = substr($host, strrpos($host, '.') + 1);

// check if $tld is in a list of allowed TLDs

Или просто попробуйте найти запись DNS домена, используя gethostbyname. Если он существует, это действительный домен. *


* Если вы не подделываете DNS, если этот случай важен для вас ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...