Литералы "или" в регулярных выражениях

Avenus

Under Glory Yield
Литералы "или" в регулярных выражениях

Привет, всем! :)

Подскажите, пожалуйста, как 3 выражения:
PHP:
(^main.*$)
(^sub.*$)
(^ext.*$)
Заменить одним с литералами "или":
PHP:
(^main|sub|ext.*$) // это не работает
Спасибо!
 

zerkms

TDD infected
Команда форума
^main
или
sub
или
ext.*$


это то, что ты имел ввиду?
 

Активист

Активист
Команда форума
ММ
/^(main|sub|ext).*$/i ?

Такое ощещение, что
(^main.*$)
использовал как не отрицание, а как указатель начала строки, как и $ - конец строки

Что ты словами хочешь сделать?

-~{}~ 11.01.10 13:26:

Вообще, логичнее

^(main|sub|ext)
 

zerkms

TDD infected
Команда форума
спойлеры детектед :)
Активист
мешаешь человеку думать готовыми ответами
 

Активист

Активист
Команда форума
zerkms, 277 сообщний у ТС, просто надо помогать коллегам после 10 дней новогоднего транса)) мозг пока включится...

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

Avenus

Under Glory Yield
:) ага, после праздников не включился еще...
Вообще, проверка на начало строки и конец строки в 3х случаях, но результат похожий.
PHP:
$route['^main.*$']='1$';
Да, хочу сделать проверку в одном выражении на начало строки:
main или sub или ext.

-~{}~ 11.01.10 13:55:

Активист, так не работает, хотя в примерах по регуляркам именно так и нужно писать.
PHP:
$route['/^(main|sub|ext).*$/i']='$1';
Думаю, нужно разобраться со скриптом, который обрабатывает эти выражения.

-~{}~ 11.01.10 14:00:

Все, спасибо!
Посмотрел что в скрипте, так работает:
PHP:
$route['(^(main|sub|ext).*$)']='$1';
Скрипт просто берет выражения из скобок, т.е. слэши не нужны.
 

Avenus

Under Glory Yield
whirlwind и правда без $ работает :)
Можешь объяснить почему? Что ты имеешь ввиду под словом "жадный"?
 

zerkms

TDD infected
Команда форума
это значит, что пытается захватить максимум возможных символов

a.*b - регулярное выражение с жадностью, захватит выделенное: 000a0000b000b0000

a.*?b - регулярное выражение с нежадностью, захватит выделенное: 000a0000b000b0000
 

Avenus

Under Glory Yield
zerkms, спасибо.
Тогда в моем случае $ нужен.

-~{}~ 15.01.10 05:40:

Вот, при таких url:
/main/sub или /sub
PHP:
^(main|sub|ext).*$ // знак $ нужен или нет?
Т.е. если могут встречаться одинаковые названия ссылок в url либо во втором сегменте, либо в первом.

-~{}~ 15.01.10 05:46:

zerkms, просто ты в пример привел без знака ? и с ним. Т.е. я не вижу знака $, также как в моем примере нет знака ? :)
 

Активист

Активист
Команда форума
Ты вообще понимаешь смысил $ ?

Нет он там не нужен, .* - сожрет все.
 

Avenus

Under Glory Yield
Активист, чтобы описать как в учебниках не смогу :)
Но, представление имею. А может и нет, раз такие вопросы задаю.
Ясно, в общем, нужно читать литературы больше.
 

Avenus

Under Glory Yield
Почему тогда в такой конструкции нужно указывать ^ начало и $ конец строки? Как же *?
PHP:
^.+$
 

zerkms

TDD infected
Команда форума
Avenus
кому нужно?

^.+$

абсолютно эквивалентна

.+

(если нет никаких модификаторов)
 

Avenus

Under Glory Yield
zerkms, в документации к CodeIgniter приложено для роутинга. Х.з., вроде хороший фреймворк, а чего так пишут тогда?

-~{}~ 15.01.10 06:10:

PHP:
$route['(^.+$)']='start/$1'; // любой URL обрабатывать в контроллере start
-~{}~ 15.01.10 06:12:

При этом, если записать (как они еще предлагают):
PHP:
$route[':any']='start/$1';
То, не работает вместе конструкция:
PHP:
$route['(^(main|sub|ext).*)']='$1'; // тут кстати без .* не будет работать, хоть и написал [b]Активист[/b]
$route[':any']='start/$1';
 

Активист

Активист
Команда форума
Avenus
Господи, почитай русскую доку с PHP.NET по регам, найди со старых зеркал...

на примере тебе обьясню

Есть строка
[email protected]22333

^[0-9a-z]+\@[0-9a-z\.]+\.[a-z0-9]+$
Захватит строку полностью


^[0-9a-z]+\@[0-9a-z\.]+\.[a-z]+$
Совпадений надейно не будет (false)

^[0-9a-z]+\@[0-9a-z\.]+\.[a-z]+
Захватит [email protected]


^[a-z]+\@[0-9a-z\.]+\.[a-z0-9]+$
Не захватит ничего (false)

[a-z]+\@[0-9a-z\.]+\.[a-z0-9]+$
Захватит [email protected]

[a-z]+\@[0-9a-z\.]+\.[a-z]+
Захватит [email protected]

Понял смысыл?

ЗЫ: $ эквивалентен (c модификатором s) символам конца строки - или [\n\r|\n], без модификатора - eof, eos

-~{}~ 15.01.10 11:19:

И еще...

У тебя не регулярное выражение preg, а хрень какая-то, которая еще где-то обрабатывается.
 
Сверху