Регулярное выражение для анализа длинных URL - PullRequest
0 голосов
/ 07 августа 2011

У меня есть это регулярное выражение, которое работает довольно хорошо, но не во всех сценариях, например, если у меня длинный URL-адрес, скажем "http://www.gob.cl/especiales/politicas-y-propuestas-de-accion-para-el-desarrollo-de-la-educacion-chilena/", он только вернет меня" http://www.gob." как часть URL-адреса

Вот мой код

    $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";
        }
    }

Может ли быть универсальное регулярное выражение, которое может анализировать все виды URL.

Ответы [ 3 ]

2 голосов
/ 07 августа 2011

Ваш хост-или-IP часть регулярного выражения

"([a-zA-Z0-9-]+)\.([a-zA-Z]{2,3})"

допускает максимум одну точку внутри. Поэтому «www.xyz.com» никогда не может совпадать.

Я не знаю, каковы ваши конкретные требования, но вы можете пойти с чем-то вроде

"([^/?#:]+)"

для основной части.

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

Вот мой способ извлечения всех URL-адресов из $ text:

preg_match_all('#(https?://[a-z0-9\.\-_\#%&=/?;,!:~@\$\+]+)#iu', $text, $m);

Предполагается, что URL-адрес начинается с https: // или http: //, а затем может иметь последовательность, ограниченнуюспециальный набор символов.

Тогда я могу использовать http://www.php.net/manual/en/function.parse-url.php на $m, чтобы получить все детали URL

Редактировать: Кроме того, если вы анализируете текст, вы можетехотите проверить периоды (.) и другие знаки пунктуации в конце URL.Я заметил, что люди могут поставить . в конце URL, если URL находится в конце предложения, например, как http://example.com.

Так что я делаю что-то вроде этого:

 if (($url[$pos]==='!') || ($url[$pos]==='.')) { // probably do not want these chars at the end of a url!
    $url = substr($url, 0, $pos);
 }
0 голосов
/ 07 августа 2011

Как насчет совпадения со всем, начиная с http: // или https://

((?:http|https)(?::\\/{2}[\\w]+)(?:[\\/|\\.]?)(?:[^\\s"]*))

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