preg_match

Dareczek

Новичок
Читаю уже целый час долбаный справочник но нечего полезного не нашел. Может вы форумчание мне поможете? ) Вот есть такое выражение
PHP:
preg_match("/(http:\/\/)?([^\/]+)/i",
    "http://www.php.net/index", $matches);
я не понимаю что делает знак вопроса там, и эти круглые скобочки. А так в справочниках начитал что делают остальные, но вот этим не нашел. Хелп форумчане ))
 

Dareczek

Новичок
Есть вопрос. Прочитал источник который посоветовал redjik. Очень крутой спасибо вам. Но хочу спросить, правильно ли я сделал проверку на домен .com.ua вот как я написал (все работает, просто может сократить код можно).
PHP:
preg_match("/(?:http:\/\/)*(?:[^\/]*)(?:\.)((?:[com]+)(?:\.)(?:[u][a]+))
 

freeek

Новичок
если в данном случае не нужно, то можно убрать, суть от этого не измениться.
 

Dareczek

Новичок
если в данном случае не нужно, то можно убрать, суть от этого не измениться.
хочу просто уточнить,
PHP:
?:www\.)?(?:[a-z0-9-]+\.)
а именно )?( тот знак вопроса по середине, он обозначает что там может быть какой угодно символ?
И еще
PHP:
(?:[a-z0-9-]+\.)+
Это означает что не нужно запомнить, и здесь может быть любая латинская буква или цифра (сразу после скобок плюс говорит о том что нужно чтобы былобы как минимум один символ, а потом еще нужа точка. А после закрывающей скобки зачем плюс? Я неочень понял...
Извините но уже понял ))) последний плюс нужен для того например если домен будет такой php.basic.net ну типо с поддоменом, то чтобы он на ту другую точку не ругался, вроде как то так )
 

Dareczek

Новичок
И заодно как можно прописать чтобы не прошли проверку например такие левые домены www.com.ua, а то это проверка не прокатывает... Хелп ))
 

freeek

Новичок
PHP:
'(?:www\.)?'
это означает, что
PHP:
www.
может быть, а может и не быть.

PHP:
'(?:[a-z0-9-]+\.)+'
это означает, что запоминать не нужно, любая латинская буква, цифры и - (минимум одна), а так же завершается
PHP:
\.
точкой, и все это добро может повториться больше одного раза, для этого за скобками +

Лучше скажи, что конкретно тебе нужно, тогда можно составить правило и объяснить почему именно так.
 

Dareczek

Новичок
PHP:
'(?:www\.)?'
это означает, что
PHP:
www.
может быть, а может и не быть.

PHP:
'(?:[a-z0-9-]+\.)+'
это означает, что запоминать не нужно, любая латинская буква, цифры и - (минимум одна), а так же завершается
PHP:
\.
точкой, и все это добро может повториться больше одного раза, для этого за скобками +

Лучше скажи, что конкретно тебе нужно, тогда можно составить правило и объяснить почему именно так.
Да нет пока все норм. СПАСИБО всем что помогаете!!! Отличный форум! :)
 

Dareczek

Новичок
Теперь точно мне извините, но я пополной запутался. В одних справочниках так в других иначе. Можете написать что делает символ ?, *, + а также точка. И можете написать регулярное выражение которое провеьяет допустим .ru сайты. Но так чтобы не попали допустим www.ru (т.е без доменного имени) и такие как www.sub.domain.ru тоже чтобы не попали. Буду ооооооочень блогодарен.
 

domencom

Новичок
http://www.php.net/manual/ru/regexp.reference.meta.php
* - квантификатор, означающий 0 или более вхождений
? - расширяет смысл метасимвола (, является также квантификатором, означающим отсутствие либо ровно 1 вхождение, также преобразует жадные квантификаторы в ленивые (смотрите повторение)
PHP:
'#http:\/\/www\.([a-z0-9-])+\.ru#i'
Ну тут я не знаю, что допустимо в доменных именах использовать. Это надо читать в RFC, возможно есть смысл добавить кириллические символы, тогда [a-z0-9-] заменить на [а-яa-z0-9-]
 

DiMA

php.spb.ru
Команда форума
Как же меня бесит, когда отвечают профессора, ничего не понимающие в регах. Особенно выбешивает, когда из-за умников на разных сайтах мое нестандартное мыло (существующее, работающее) не проходит их сраный рег.

1. втюхивать спрашивающему сложные конструкции типа (?: ) ни к чему

2. (?:[a-z0-9-]+\.)+com - не стандартный вариант, он этим интересен по задумке, но ни к чему. Чтобы было тебе известно, после ".com" можно поставить ее точку и эта рега ее не схавает. Пример: "www.phpclub.ru" и "www.phpclub.ru."

3. "([a-z0-9-])+" - адовый бред. Не, оно работает. Но процессор регов потребляет на порядок больше памяти и времени на его вычисление. Никогда не пиши квантификаторы после скобки, если этого можно избежать. Правильно: ([a-z0-9-]+)

4. чтобы проверить домен, достаточно рега "[a-z\d.-]". Ну, нахрена писать уточнения про www, точки и т.д.? Ну, домен ssss..... пройдет валидацию и что, сайт сломается?

5. в доменах, включая национальные, русских букв или иных символов, кроме описанного в пункте 4, не бывает и не будет
 
  • Like
Реакции: WMix

DiMA

php.spb.ru
Команда форума
учи матчасть, \w включает подчеркивание, что в доменах недопустимо

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

fixxxer

К.О.
Партнер клуба
с \d надо осторожнее, если включен unicode режим (/u), будут неожиданные вещи )

PHP:
<?php
$str = '٤';
var_dump(preg_match('/^\d+$/u',$str,$m), $m);
Код:
$ php test.php 
int(1)
array(1) {
  [0]=>
  string(2) "٤"
}
 

Ragazzo

TDD interested
fixxxer
это не изза юникода, а изза локали вроде, т.к. эти символы являются цифрами да. :S
 

domencom

Новичок
Как же меня бесит, когда отвечают профессора, ничего не понимающие в регах. Особенно выбешивает, когда из-за умников на разных сайтах мое нестандартное мыло (существующее, работающее) не проходит их сраный рег.
Ну все это печально, но на форуме какбэ зачастую дают направление а не установку к действию. Кто-то скопипастит, другой пойдет и разберется. Постановки задачи, как таковой, не было, поэтому люди и выдают абстрактные решения неизвестно какой задачи. Если верить статье http://www.antula.ru/domain-21.htm, то ваше предложение
чтобы проверить домен, достаточно рега "[a-z\d.-]"
ни о чем так же, как и другие.
 
Сверху