[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярка для кириллических URL
5maks5
Здравствуйте ув. пользователи форума.

Имею функцию по проверке URL:

function checkurl($url) {

$url=trim($url);
if (strlen($url)==0) return 1;
if (!preg_match("~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".
"(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|".
"org|mil|pro|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?".
"!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
"?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i",$url,$ok))
return -1;
if (!strstr($url,"://")) $url="http://".$url;
$url=preg_replace("~^[a-z]+~ie","strtolower('\\0')",$url);
$url = parse_url($url);
$url = $url["host"];
return $url;
}


Мне нужно добавить сюда поддержку кириллических доменов, таких как мойсайт.рф

Подскажите как правильно мне это сделать?



Спустя 1 час, 22 минуты, 40 секунд (3.06.2011 - 10:49) DedMorozzz написал(а):
Цитата
(?:com|net|".
"org|mil|pro|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})

Вот сюда добавляем рф твоё
|inc|name|рф|[a-z]{2}
..

Спустя 4 минуты, 19 секунд (3.06.2011 - 10:54) 5maks5 написал(а):
То что Вы предложили верно, но функция не пропускает русские буквы домена. Даже если я добавляю рф в список доменных зон, то возвращается return -1 следовательно домен мойсайт.рф не прошёл.

Спустя 2 минуты, 42 секунды (3.06.2011 - 10:56) DedMorozzz написал(а):
добавь модификатор "u" в конец
Замени :#[^ '\"&<>]*)?$~i На :#[^ '\"&<>]*)?$~iu

Спустя 2 минуты, 46 секунд (3.06.2011 - 10:59) 5maks5 написал(а):
Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 160 in /ххххххххх/check_url.php on line 25

25-ая строка: "?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~iu",$url,$ok))

Спустя 2 минуты, 33 секунды (3.06.2011 - 11:02) DedMorozzz написал(а):
ммм, уже интересно, начит юникод не нужен, а вот почему не находит, сейчас разберусь, у себя протестирую регулярку, после отпишусь

Спустя 4 минуты, 15 секунд (3.06.2011 - 11:06) DedMorozzz написал(а):
Не возникло проблем:
Цитата
<?php

$url = 'http://www.google.рф';


if (!preg_match("~^(?sad.gif?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".
"(?::[a-z0-9_-]{1,32})?@)?)?(?sad.gif?:[a-z0-9-]{1,128}\.)+(?:com|net|".
"org|mil|pro|edu|arpa|gov|biz|info|aero|inc|name|рф|[a-z]{2})|(?!0)(?sad.gif?".
"!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
"?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i",$url))
echo "No";
else{echo "Yes";}
?>

Yes вывело

Спустя 3 минуты, 40 секунд (3.06.2011 - 11:10) 5maks5 написал(а):
результат -1
http://seo.celsoft.ru/ введите тут google.рф и нажмите проверить сами увидите.

Спустя 4 минуты, 35 секунд (3.06.2011 - 11:14) 5maks5 написал(а):
Вставил ваш код в чистый файл и запустил. Результат:

Warning: preg_match() [function.preg-match]: Compilation failed: unrecognized character after (? or (?- at offset 4 in /home/p27064/www/seo.celsoft.ru/1.php on line 10
No

Спустя 2 минуты, 8 секунд (3.06.2011 - 11:16) DedMorozzz написал(а):
у тебя походу проверяется существование такого адресса. Добавь ещё и сам адресс, что бы был на русском, к примеру поисковик "Нигма.РФ", дабы проще было тестить


Хм, а текст в файле в какой кодировке? -- хотя не важно это. Я и в 1251 проверил всё работает

Спустя 7 минут, 8 секунд (3.06.2011 - 11:23) DedMorozzz написал(а):
показывай код который вставил, ибо вот залил на хостинг
***Убрал***

Спустя 5 минут, 25 секунд (3.06.2011 - 11:29) 5maks5 написал(а):
<?php

$url = 'http://www.google.рф';


if (!preg_match("~^(?sad.gif?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".
"(?::[a-z0-9_-]{1,32})?@)?)?(?sad.gif?:[a-z0-9-]{1,128}\.)+(?:com|net|".
"org|mil|pro|edu|arpa|gov|biz|info|aero|inc|name|рф|[a-z]{2})|(?!0)(?sad.gif?".
"!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
"?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i",$url))
echo "No";
else{echo "Yes";}
?>

Спустя 56 секунд (3.06.2011 - 11:30) 5maks5 написал(а):
Вставь код в пхп теги что бы на смайлы не заменялось

Спустя 54 секунды (3.06.2011 - 11:31) DedMorozzz написал(а):
:))
?sad.gif?:h
Смайлы покопировал

$url = 'http://www.google.рф';


if (!preg_match("~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".
"(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|".
"org|mil|pro|edu|arpa|gov|biz|info|aero|inc|name|рф|[a-z]{2})|(?!0)(?:(?".
"!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
"?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i",$url))
echo "No";
else{echo "Yes";}

?>


Цитата
Вставь код в пхп теги что бы на смайлы не заменялось
теги не причём. Надо галочку убрать "Включить смайлы"

Спустя 9 минут, 23 секунды (3.06.2011 - 11:40) 5maks5 написал(а):
Сработало. Доменная зона рф прошла. Теперь еще надо сделать что бы и домен само название домена проходило. мойсайт.рф к примеру

P.S. Извиняюсь за грамматику, дел много по дому. Всё делаю торопясь.

Спустя 6 минут, 59 секунд (3.06.2011 - 11:47) DedMorozzz написал(а):
(?:(?:[a-z0-9-]{1,128}\.)+
замени на
(?:(?:[a-z0-9а-яё-]{1,128}\.)+

Спустя 7 минут, 4 секунды (3.06.2011 - 11:54) 5maks5 написал(а):
Всё работает. Огромнейшее спасибо Вам что помогли мне.
Сейчас надо будет еще подумать как сделать так, что когда урл приходит гетом в файл, а там уже проверка если домен мойсайт.рф, то пускать дальше, если moysite.ru(com,net и т.д.) то тоже пускать процесс дальше, а вот если пришёл домен moysite.рф или мойсайт.ru(com,net и т.д.) то выдавать ошибку что формат домена неверен. Направьте меня в нужное русло пожалуйста ))

Спустя 3 минуты, 34 секунды (3.06.2011 - 11:58) DedMorozzz написал(а):
Цитата

((?:[a-z0-9-]{1,128}\.)+(?:com|net|".
"org|mil|pro|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2}))|(?:[а-яё0-9-]{1,128}\.)+рф)

как-то так

Думаю какой кусок на вот это догадаешься заменить

Спустя 10 минут, 31 секунда (3.06.2011 - 12:08) 5maks5 написал(а):
Извините, а на что это заменить? Я сейчас попробовал не получилось. Я в регулярках нуб нубом :)

Спустя 2 минуты (3.06.2011 - 12:10) DedMorozzz написал(а):
Было:
Цитата
(?:[a-z0-9-]{1,128}\.)+(?:com|net|".
"org|mil|pro|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})

Стало
Цитата
(?:(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|".
"org|mil|pro|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2}))|((?:[а-яё0-9-]{1,128}\.)+рф))

Спустя 2 минуты, 37 секунд (3.06.2011 - 12:13) 5maks5 написал(а):
if (!preg_match("~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".
"(?::[a-z0-9_-]{1,32})?@)?)?(?:((?:[a-z0-9-]{1,128}\.)+(?:com|net|".
"org|mil|pro|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2}))|(?:[а-яё0-9-]{1,128}\.)+рф)|(?!0)(?:(?".
"!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
"?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i",$url))
echo "No";
else{echo "Yes";}


Вроде правильно заменил, но ошибка.

Спустя 46 секунд (3.06.2011 - 12:14) DedMorozzz написал(а):
отредактировал предыдущее сообщение, со скобками была проблема

Спустя 3 минуты, 5 секунд (3.06.2011 - 12:17) 5maks5 написал(а):
Я так и понял что где-то ошибка т.к. первый раз заменил и не получилось, тоже ошибка была и решил написать. Вдруг не то заменил.
Сейчас всё работает. Провёл тест всё работает как нужно. За что вам огромное человеческое спасибо!

Спустя 22 минуты, 48 секунд (3.06.2011 - 12:40) 5maks5 написал(а):
Снова проблема))
Если русский урл приходит гетом и пишется в $url то домен выходит вопросиками, а если английский то всё нормально.

$url = $_GET['url'];

Спустя 1 час, 29 минут, 22 секунды (3.06.2011 - 14:09) DedMorozzz написал(а):
Кириллица в гете, это как баба на корабле.
Иль постом передавай иль енкод-декод делай

Спустя 2 минуты, 20 секунд (3.06.2011 - 14:11) 5maks5 написал(а):
Хорошо. Спасибо.


_____________
Где исходники вселенной?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.