PHP RegEx для имени веб-сайта

Дубликат: проверка PHP/regex для URL

Моя цель - создать регулярное выражение PHP для имени веб-сайта. Регулярное выражение предназначено для формы сбора потенциальных клиентов и должно принимать любой законный синтаксис имени веб-сайта, который может ввести кто-то. После исчерпывающего поиска я удивлен, что не могу найти его там.

Вот совпадения регулярных выражений, которые я ищу:

И он также должен соответствовать:

  • любой из вышеперечисленных с завершающей обратной косой чертой, например: somewebsite.com/
  • поддомены

person edt    schedule 11.05.2009    source источник
comment
Вы действительно говорите об адресах сайтов, а не об их названиях.   -  person Anonymous    schedule 11.05.2009


Ответы (5)


Возможно, вам придется настроить его:

<?php

$pattern = '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&amp;?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/';

$url1  = "http://www.somewebsite.com";
$url2  = "https://www.somewebsite.com";
$url3  = "https://somewebsite.com";
$url4  = "www.somewebsite.com";
$url5  = "somewebsite.com";

function valURL($pattern, $url) {

        $return = false;

        if(preg_match($pattern, $url)) {
                $return = true;
        }

        if($return == true) {
                echo "Match URL: <font color='green'>" . $url . "</font><br /><br />";
        } else {
                echo "Try Again: <font color='red'>URL: " . $url . "</font><br /><br />";
        }
}

valURL($pattern, $url1);
valURL($pattern, $url2);
valURL($pattern, $url3);
valURL($pattern, $url4);
valURL($pattern, $url5);

?>
person Phill Pafford    schedule 11.05.2009
comment
@PhillPafford Я связал ваш ответ с этим вопросом: stackoverflow.com/a/23567981/976775 Спасибо за это регулярное выражение! - person MrYoshiji; 09.05.2014

RegEx не требуется.

$subject = 'example.com';
$part = (stripos($subject, 'http://') === FALSE)  ? 'http://' : '' ;
var_dump(filter_var($part.$subject, FILTER_VALIDATE_URL));
person mandaleeka    schedule 11.05.2009
comment
Вам не хватает близкого родителя! - person Matt K; 11.05.2009
comment
Обратите внимание, что это только для PHP 5.2+ - person Ólafur Waage; 11.05.2009
comment
Это очень полезно, но не соответствует следующему: somewebsite.com - person edt; 11.05.2009
comment
Энди, проверьте свой код перед публикацией. Это приводит к FALSE. Я проголосовал за вас, потому что регулярные выражения настолько злоупотребляют, что это безумие. - person The Pixel Developer; 13.05.2009

Я решил сравнить ответы здесь, чтобы доказать, что регулярные выражения не подходят для таких простых задач. Код Энди Ликмана на 30-60% быстрее, чем другие ответы. У него была ошибка, но я исправил ее строкой кода. Мои результаты вы можете посмотреть ниже.

Вот код, на котором выполнялись тесты.

http://pastie.org/476900

замещающий текст http://img254.imageshack.us/img254/7821/capturevzh.png< /а>

PS Если кто-то еще использует регулярное выражение для проверки URL-адреса, я могу сойти с ума ;)

person The Pixel Developer    schedule 13.05.2009

/^([a-z0-9]([-a-z0-9]*[a-z0-9])?\\.)+((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|(m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])$/i

http://www.shauninman.com/archive/2006/05/08/validating_domain_names

Предоставлено Google. Это ОЧЕНЬ сложно, поэтому у кого-то может быть проще.

РЕДАКТИРОВАТЬ: сначала попробуйте ответить Энди. Если вы можете найти альтернативу регулярному выражению, 9/10 альтернатива намного лучше.

person Macha    schedule 11.05.2009
comment
Это очень полезно, но не соответствует следующему: somewebsite.com - person edt; 11.05.2009

person    schedule
comment
Я не могу заставить ваш код работать. Можете ли вы привести простой пример использования? - person edt; 11.05.2009
comment
$pattern = /^(https?://)?(([0-9a-z_!'().&=$%-]: )?[0-9a-z_!'().&=$% -]@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!'()-]\.) ([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[az-z]{2,6})(:[0-9]{1 ,4})?((/?)|(/[0-9a-z_!*'().;?:@&=$,%#-])/?)$/ - person Phill Pafford; 11.05.2009
comment
Извините, но все еще не работает для меня. Это то, что я пытаюсь. Любое предложение? $some_url = 'some-url.com'; $pattern = /^(https?://)?(([0-9a-z_!'().&=$%-]: )?[0-9a-z_!'().&=$% -]@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!'()-]\.) ([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[az-z]{2,6})(:[0-9]{1 ,4})?((/?)|(/[0-9a-z_!*'().;?:@&=$,%#-])/?)$/; if(preg_match($pattern, $some_url)) { эхо действительно; } еще { эхо неверно; } - person edt; 11.05.2009