Регулярное выражение, проблема валидности URL - PullRequest
2 голосов
/ 06 августа 2010

Пример ссылки
https://stackoverflow.com/questions/tags/ruby
true url

https://stackoverflow.com/questions/@#dsd/javascript
false url

Как проверить правильность только / тегов / частине весь URL

Кто-нибудь, кто мне помогает? Кто-нибудь дает мне регулярное выражение для этой части URL.

Как я проверяю свой URL в соответствии с моим состоянием

Спасибо

Ответы [ 2 ]

1 голос
/ 08 августа 2010

danyim ответ точный, хотя он может не соответствовать вашим потребностям, как отмечено в комментариях. Кроме того, его решение было на основе php. После сканирования вашего участия в теге, я предполагаю, что вы на самом деле предпочли бы решение javascript (поэтому я предоставлю оба!).

Во-первых, рефакторинг своего php:

function isValidURL($url) {
    $regex = "((https?|ftp)\:\/\/)?"; // SCHEME 
    $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass 
    $regex .= "((([a-z][a-z0-9-.]*)\.([a-z]{2,3}))|(([12]?[0-9]?[0-9]\.){4}))"; // Host or IP 
    $regex .= "(\:[0-9]{2,5})?"; // Port 
    $regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path 
    $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query 
    $regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor 
    return preg_match($regex, lcase($url));
}

Обратите внимание, что я изменил return для выполнения операции lcase перед проверкой URL. Вы также можете использовать регистрозависимый флаг в регулярном выражении, чтобы избежать необходимости в этом. Как уже отмечалось, есть несколько частей, которые могут или не могут быть действительными для ваших сценариев использования. В частности, у вас может никогда не возникнуть ситуация, когда вы хотите принять URL-адрес, содержащий имя пользователя / pw или исходящий из статического IP-адреса. Вы можете изменить регулярное выражение, чтобы исключить любые части соответствия, которые никогда не будут действительными, удалив соответствующую строку. Кроме того, вот вторая опция для линии //Host or IP, чтобы сделать ее только хостом:

    $regex .= "([a-z][a-z0-9-.]*)\.([a-z]{2,3})"; // Host only 

А теперь то же самое в javascript (объединенном вместе, потому что js обрабатывает регулярные выражения, отличные от строк ... корректировки будут легче делать в версии php, а затем подражать здесь):

function isValidURL(url) {
   var regex = /((https?|ftp)\:\/\/)?([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?((([a-z][a-z0-9-.]*)\.([a-z]{2,3}))|(([12]?[0-9]?[0-9]\.){4}))(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?/i
   return (url.match(regex));
}
1 голос
/ 06 августа 2010

Полный URL:

function isValidURL($url) {
    return preg_match('^(https?|ftp)\:\/\/([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?\$', $url);
}

Имена папок Unix (которые в общем-то находятся между /):

function isValidPath($url) {
    return preg_match('(\/([a-z0-9+\$_-]\.?)+)*\/?', $url);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...