Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вырезать из url домен
 
 автор: TetRiska   (20.04.2013 в 15:27)   письмо автору
 
 

Всем привет, никак не могу разобраться в следующей задаче. Чтобы пользователя не тревожить, всякими напоминаниями о не корректном вводе, я хочу на сервере обрабатывать вводимый им url, а именно, если он введет:

...........

- http://site.ru/ - должно вырезать site.ru
- http://site.ru - должно вырезать site.ru
- site.ru/ - должно вырезать site.ru
- site.ru - так и останется

- http://www.site.ru/ - должно вырезать www.site.ru
- http://www.site.ru - должно вырезать www.site.ru
- www.site.ru/ - должно вырезать www.site.ru
- www.site.ru - так и останется

...........

Т.е. мне важны www. если они есть вводимом url, а также сам домен, никаких слешей в конце и другого хлама, чисто url главной странички с www. или без www. если присутствовало

Также после обрезания проверить на корректность

Спасибо

   
 
 автор: Sfinks   (20.04.2013 в 17:27)   письмо автору
 
   для: TetRiska   (20.04.2013 в 15:27)
 

Для этого не нужны РВ. Для этого нужна одна только функция: parse_url()

   
 
 автор: TetRiska   (20.04.2013 в 18:00)   письмо автору
 
   для: Sfinks   (20.04.2013 в 17:27)
 

$str = parse_url("http://site.ru/");
echo '<pre>';
print_r($str['host']);
echo '</pre>';
//site.ru


$str = parse_url("site.ru");
echo '<pre>';
print_r($str['host']);
echo '</pre>';
//Notice:  Undefined index: host in

   
 
 автор: Sfinks   (20.04.2013 в 19:32)   письмо автору
 
   для: TetRiska   (20.04.2013 в 18:00)
 

Ну можно же немного подтолкнуть парсер к тому чтобы он правильно определял какая часть адреса чем является....
<?php
  $url 
"site.ru";
  
  
$host parse_urlpreg_match('#^https?://#',$url) ? $url 'http://'.$urlPHP_URL_HOST )
    or die(
'Не верное имя домена');

  echo 
$host;
?>

   
 
 автор: TetRiska   (20.04.2013 в 20:18)   письмо автору
 
   для: Sfinks   (20.04.2013 в 19:32)
 

$url = "://www.site.ru/";

уже не сработает, хотя вполне можно было вырезать
даже при успехе, урл бы пришлось все равно проверять, чтоб ничего лишнего (кавычки, запятые)

Пошел путем реги, все же универсальней

В общем рега готова:
/(?:[\w\d][-\w\d]*\.)+(?:biz|com|info|name|net|org|[a-z]{2})/i

Но есть в ней мелкие огрехи:
в начале доменного имени пропускает
_ or __ - одно или много нижних подчеркиваний

в центре доменного имени пропаускает
_ or __ - одно или много нижних подчеркиваний
-- - много тире

в конце доменного имени пропускает
_ or __ - одно или много нижних подчеркиваний
- or -- - одно или много тире

т.е.
_popasike.ru - пропустило
__popasike.ru - пропустило
-popasike.ru - не пропустило
--popasike.ru - не пропустило
pop_asike.ru - пропустило
pop__asike.ru - пропустило
pop-asike.ru - пропустило
pop--asike.ru - пропустило
popasike_.ru - пропустило
popasike__.ru - пропустило
popasike-.ru - пропустило
popasike--.ru - пропустило

помогите допилить :)

   
 
 автор: Deed   (20.04.2013 в 22:31)   письмо автору
 
   для: TetRiska   (20.04.2013 в 20:18)
 

/.*((|www\.)\b\w+?\.[a-z]{2,5}).*/
Смотрим, что остается в $1.

   
 
 автор: TetRiska   (20.04.2013 в 23:30)   письмо автору
 
   для: Deed   (20.04.2013 в 22:31)
 

к чему эта регулярка?

   
 
 автор: Deed   (21.04.2013 в 08:46)   письмо автору
 
   для: TetRiska   (20.04.2013 в 23:30)
 

Она была написана второпях, "на колене".
Вот решение проблемы: http://stackoverflow.com/questions/1755144/how-to-validate-domain-name-in-php
Особенно прекрасен второй ответ с рейтингом 7:

<?php
$domain 
"stackoverflow.com";

if(
filter_var(gethostbyname($domain), FILTER_VALIDATE_IP))
{
    return 
TRUE;
}
?>

   
 
 автор: TetRiska   (22.04.2013 в 12:27)   письмо автору
 
   для: Deed   (21.04.2013 в 08:46)
 

проверить пока нет возможности, но видать вы меня не поняли, мне нужно вырезать в первую очередь с отбросом лишних символов прочего хлама.......а если не удастся вырезать, возвращаем фолс, а насколько вижу, ваш пример только возвращает тру или фолс и все, потом все равно придется делать вырезание

   
 
 автор: Deed   (22.04.2013 в 13:52)   письмо автору
 
   для: TetRiska   (22.04.2013 в 12:27)
 

Держите:

[a-z][-_]?[a-z\d]+?[^_-]\.[a-z]{2,5}

можете проверить на вашем списке:

_popasike.ru - пропустило
__popasike.ru - пропустило
-popasike.ru - не пропустило
--popasike.ru - не пропустило
pop_asike.ru - пропустило
pop__asike.ru - пропустило
pop-asike.ru - пропустило
pop--asike.ru - пропустило
popasike_.ru - пропустило
popasike__.ru - пропустило
popasike-.ru - пропустило
popasike--.ru - пропустило


тест: http://phpfiddle.org/lite/code/06w-pe3

   
 
 автор: TetRiska   (22.04.2013 в 17:32)   письмо автору
 
   для: Deed   (22.04.2013 в 13:52)
 

popa.sike--.ru - пропустило

будет popa.sike ))

может лучше мою модернизировать, чтоб подчеркивания и тире не пропускало там где не нужно?

и почему вы записали a-z, а не \w

   
 
 автор: Deed   (22.04.2013 в 22:12)   письмо автору
 
   для: TetRiska   (22.04.2013 в 17:32)
 

Потому, что \w включает в себя символ нижнего подчеркивания "_". И, насколько мне не изменяет интуиция, и тире "-", и "_" может быть в адресе только в одном экземпляре.
(Или нет?)
Более того, начинаться и заканчиваться имя домена должно на букву или цифру.
Это во-первых.
Во-вторых, нигде не было сказано, что возможны субдомены в адресах.
И в-третьих, что это за ресурс такой? Для садистов? Или для страдающих тремором и не попадающих по нужным клавишам юзеров??
Ладно, подумаем...
вот:

/([a-z][-_]?[a-z\d]+?[^_-]\.){0,}[a-z][-_]?[a-z\d]+?[^_-]\.[a-z]{2,5}/i

для субдоменов

Ну и вот: http://phpfiddle.org/lite/code/8r6-sct - регулярки для очистки доменных имен от издевательств.
Универсум:

<?php
function refresh_links($badstr){
    
$strong=preg_replace("/^[^a-z\d]/i","",$badstr);
    
$str=preg_replace("/[^a-z\d]$/i","",$strong);
    
$str=preg_replace("/[^a-z\d](?=\.)/i","",$str);
    
$str=preg_replace("/(?<=\.)[^a-z\d]/i","",$str);
    
$str=preg_replace("/[^\w\d-\.]/i","",$str);
    
$str=preg_replace("/([_\.-])+/","$1",$str);
    return 
$str;
}
$bad_str="_p---opa.si++__ke--.ru";
$strong_str=refresh_links($bad_str);
echo 
$strong_str;
?>

   
 
 автор: pavel.nikandrov   (16.04.2017 в 11:11)   письмо автору
 
   для: Deed   (22.04.2013 в 22:12)
 

/([a-z][-_]?[a-z\d]+?[^_-]\.){0,}[a-z][-_]?[a-z\d]+?[^_-]\.[a-z]{2,5}/i

а можно его еще доработать, что оно корректно обрабатывало сайты, типа:

http://xn----7sbajjbec0dd3k7b.xn--p1ai/vse_serii_podryad/multiki
http://xn-----7kcabbec2afz1as3apmjtgqh4hrf.xn--p1ai/dlya-komyutera/viber-dlya-windows-7

   
 
 автор: vip.beggins   (22.07.2016 в 12:06)   письмо автору
256.7 Кб
 
   для: TetRiska   (20.04.2013 в 15:27)
 

Интернет-сервис OF.ua специализируется на предоставлении услуг по регистрации имен для сайтов в приватных доменах OF.ua, OT.ua, PRI.ua, ViD.ua, WS.ua.
https://of.ua/ru/

   
 
 автор: werfitr   (13.10.2016 в 17:52)   письмо автору
 
   для: vip.beggins   (22.07.2016 в 12:06)
 

Создайте свой бренд в интернете. Купить домен на https://of.ua/
к нему получить такое же имя для почты и бесплатную сайт визитку.

   
 
 автор: werfitr   (14.10.2016 в 14:27)   письмо автору
 
   для: werfitr   (13.10.2016 в 17:52)
 

Чтобы купить домен нужно проверить домен на занятость. проверка домена на https://of.ua/ Пакет All inclusive Доменное имя + имя почты + сайт-визитка бесплатно

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования