Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Регулярка разбиения страницы


Автор: capitan 25.8.2010, 00:29
Есть варианты страниц:
index
index.html
index2.html

Пишу регулярку: 
Код

        $pattern = '/^(.*)([0-9]{0,3})?\.?([a-zA-z]+)?$/Ui'; 
        preg_match($pattern, $url, $modules); 
        var_dump($modules);


получаю результаты:
Код

array (
  0 => 'index',
  1 => '',
  2 => '',
  3 => 'index',
)

array (
  0 => 'index.html',
  1 => 'index',
  2 => '',
  3 => 'html',
)

array (
  0 => 'index2.html',
  1 => 'index',
  2 => '2',
  3 => 'html',
)


Не пойму, почему в 1 варианте результат стоит в 3 ключе, а не в 1-м???? Как победить?

Автор: enoff 25.8.2010, 01:19
Код

/^(.*)([0-9]{0,3})(?:\.([a-z]*))?$/Ui

Автор: capitan 25.8.2010, 08:43
enoff, спасибо, работает. Но не понимаю эту часть 
Код

(?:\.([a-z]*))
  в особенности
Код

?:


Как это работает, что за условие такое?

Автор: enoff 25.8.2010, 20:13
(?smile - незахватывающие скобки. Если использовать скобки без ?: то данные из подмаски будут в массиве $modules, (и в переменной $n или \\n(где n - номер подмаски) в самом паттерне).
Код

(?:\.([a-z]*))?

если убрать ?:, то в массиве просто будет дополнительное значение.
Сгруппировал необязательное расширение с точкой, чтобы не разбираться с жадностью квантификаторов (из-за чего значение в массиве было не там, где хотелось бы).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)