[PHP] Рекурсивное регулярное выражение

12
O
На сайте с 29.05.2008
Offline
195
1470

Здравствуйте.

Пишу шаблонизатор под локальную систему.

Есть строка {stylesheet:general,test,styles}, она может быть и {stylesteet:test}, и просто {stylesheet}. Т.е. идет инклуд либо файла по умолчанию, либо одного файла из директории с темой, либо множественный инклуд (предварительно объединив в один).

Так вот, нужно одним регулярным выражением определить в коде эту строку ({stylesheet...) и заодно в matches занести инклуд либо список инклудов (без запятых в отдельный массив).

Вот выражение для одного инклуда

^"{stylesheet[:]?([a-z0-9]{0,24})}"^

как дополнить его, чтобы в матчес попадали и другие (т.е. что после запятой).

Шаблонизатор работает примерно так:

static function setCss($custom_css = 'general') {

if ((int) self::$cache['available'] != 2) {
while (preg_match('^"{stylesheet[:]?([a-z0-9]{0,24})}"^i', self::$out, $matches)) {

if ($matches[1]) $css_file = $matches[1];
else $css_file = $custom_css;

if (is_file(DIR_TEMPLATE.DIR_CSS.$css_file.'.css')) {
$css_source = DIR_TEMPLATE.DIR_CSS.$css_file.'.css';
$css_time = date("s", filemtime($css_source));
$css_size = substr(filesize($css_source), -1);
if (!defined('BROWSER_HTML'))
define('BROWSER_HTML', 4);
$css_id = substr($css_file, 0, 3);
$css_file = DIR_CSS.$css_id.BROWSER_HTML.$css_size.$css_time.'.css';
if (!is_file($css_file)) {
//Повино додаватися завдань на видалення застарілих файлів по префіксу через Debug
file_put_contents($css_file, self::generateCss($css_source));
}
}
self::$out = preg_replace('^'.$matches[0].'^i', '/'.$css_file, self::$out);
}
if (CACHE == 2) self::$cache['stream'] = self::$out;
}
}
siv1987
На сайте с 02.04.2009
Offline
427
#1

^"{stylesheet[:]?([a-z0-9,]{0,24})?}"^

O
На сайте с 29.05.2008
Offline
195
#2

siv1987, читайте внимательно. Нужно чтобы оно не просто с запятой захватило, а захватило все значения что перечислены через запятую в отдельный массив в $matches.

Кто-нибудь слышать об рекурсивном поиске с помощью r: ?

siv1987
На сайте с 02.04.2009
Offline
427
#3
ortegas:
Нужно чтобы оно не просто с запятой захватило, а захватило все значения что перечислены через запятую в отдельный массив в $matches.

Что мешает разбить строку в массив используя delimiter ','? Или я действительно не понимаю о чем речь

кстати да, фиг скобки нужно экранировать

^"\{stylesheet[:]?([a-z0-9,]{0,24})?\}"^

O
На сайте с 29.05.2008
Offline
195
#4

Ну а одной регуляркой не обойтись?

Сделал пока explode(), но может кто-то таки знаком с рекурсивным поиском в регулярном выражении?

siv1987
На сайте с 02.04.2009
Offline
427
#5
ortegas:
Ну а одной регуляркой не обойтись?

А у вас их сколько, не одно разве? И чем explode не угодил?

L
На сайте с 07.12.2007
Offline
351
#6
ortegas:
но может кто-то таки знаком с рекурсивным поиском в регулярном выражении?

На php-клубе не советуют из юзать, правда, темка старая.

Регулярки должны быть простые и понятные, зачем усугублять их рекурсией :)

PS: "Эту проблему я решу с помощью регулярного выражения, решил программист.

С этого момента у него стало на одну проблему больше."

O
На сайте с 29.05.2008
Offline
195
#7

siv1987, чтобы без explode сразу в массив matches попадали все значения через запятую.

IL
На сайте с 20.04.2007
Offline
435
#8
ortegas:
чтобы без explode сразу в массив matches попадали все значения через запятую.

А зачем? Если красота кода волнует, то есть другие места, заслуживающие внимания..
Ускорить? Спорно.. рекурсивная регулярка vs explode вряд ли выйдет победителем.
Just For Fun? так это.. самому надо, а не других озадачивать
Что-то пропустил?

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
O
На сайте с 29.05.2008
Offline
195
#9

ivan-lev, но я и так уже прибегаю к регулярному выражению, зачем еще плодить explode если можно дописать выражение?

siv1987
На сайте с 02.04.2009
Offline
427
#10
ortegas:
но я и так уже прибегаю к регулярному выражению, зачем еще плодить explode если можно дописать выражение?

Плодить говно-выражения конечно же лучше, чем использовать одну строчку кода explode как все нормальные люди.

А рекурсии здесь нет, рекурсия применяется к вложенности.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий