Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите закончить регулярное выражение
Форумы портала PHP.SU » PHP » Регулярные выражения » Помогите закончить регулярное выражение

Страниц (1): [1]
 

1. sandals - 08 Марта, 2013 - 00:10:29 - перейти к сообщению
Всем привет! Снова нужна помощь.
С горем пополам написал выражение, которое проверяет совпадение на IP, либо на URL:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. preg_match("/^[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}$/", $domain, $match);
  3.  


Теперь мне нужно, чтобы была проверка на совпадение такого вида:
domain.com:port и ip:port (1.1.1.1:12345, либо domain.com:12345)

Также нужно проверить, чтобы порт был не меньше и не равен нулю, и не больше, чем 65535

Думал о варианте:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. list($address, $port) = explode(':', $_POST['address']);
  3.  

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

Почти весь день про регулярные выражения читал, но толком ничего не получается.
2. esterio - 08 Марта, 2013 - 00:19:26 - перейти к сообщению
Для домена parse_url
3. OrmaJever - 08 Марта, 2013 - 00:41:38 - перейти к сообщению
CODE (htmlphp):
скопировать код в буфер обмена
  1. '#(
  2. [a-z0-9_.-]+ \. [a-z]{2-4}
  3. |
  4. \d{1,3} \. \d{1,3} \. \d{1,3} \. \d{1,3}\
  5. )
  6. (:\d{1,5})?
  7. #ix'

Побыстрому написал как вариант. А диапазон порта нужно проверить отдельно после регулярки.
4. evgenijj - 08 Марта, 2013 - 00:52:58 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $str1 = '127.0.0.1';
  2. $pattern = '~^((\d{1,3}\.){3}\d{1,3}|([-a-z0-9]+\.)*[-a-z0-9]+\.[a-z]{2,6})$~i';
  3. if (preg_match($pattern, $str1, $matches)) {
  4.     echo 'yes<br/>';
  5. } else {
  6.     echo 'no<br/>';
  7. }
  8. echo '<hr>';
  9. $str2 = 'www.server.com';
  10. if (preg_match($pattern, $str2, $matches)) {
  11.     echo 'yes<br/>';
  12. } else {
  13.     echo 'no<br/>';
  14. }

P.S. Проверка IP -- формальная.
5. sandals - 08 Марта, 2013 - 15:35:33 - перейти к сообщению
Всем спасибо. Решил проблему вот таким способом:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. (^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}:\d{5}$)|(^[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}:\d{5}$)
  3.  


Если есть более лаконичные способы - прошу Закатив глазки .

p.s. очень помог сайт rubular.com
6. OrmaJever - 08 Марта, 2013 - 15:46:59 - перейти к сообщению
sandals пишет:
:\d{5}

это значит что порт может содержать только(!) 5 цифр, тоесть :80 или :8080 не подходит
7. sandals - 08 Марта, 2013 - 15:54:14 - перейти к сообщению
OrmaJever пишет:
это значит что порт может содержать только(!) 5 цифр, тоесть :80 или :8080 не подходит

Это сделано специально, т.к. скрипт обрабатывает адреса с портами из пяти цифр. Иначе нужно исправить на {1,5}.
8. LIME - 08 Марта, 2013 - 16:53:41 - перейти к сообщению
вообщето точка это любой символ
если нужна именно точка ее надо экранировать
(Добавление)
и на будущее надо учесть IP6
9. sandals - 08 Марта, 2013 - 17:50:47 - перейти к сообщению
LIME пишет:
вообщето точка это любой символ
если нужна именно точка ее надо экранировать
(Добавление)
и на будущее надо учесть IP6


Спасибо за подсказку! По идее должно быть вот так:

PHP:
скопировать код в буфер обмена
  1.  
  2. (^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{5}$)|(^[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}:\d{5}$)
  3.  


http://rubular[dot]com/r/GHJx78Lcmo

 

Powered by ExBB FM 1.0 RC1