Неверный поиск в строке

panika

Новичок
Template:
PHP:
<script type="text/javascript">
	var resAlert, myMap;
	ymaps.ready( function() {
		ymaps.geocode('{:adres}').then(function(res){
			var center = res.geoObjects.get(0).geometry.getCoordinates();
			myMap = new ymaps.Map('map',{
				center: center,
				zoom : 15,
				behaviors: ['default', 'scrollZoom']
			});
			myMap.geoObjects.add(new ymaps.Placemark(center));
			myMap.controls
				// Кнопка изменения масштаба
					.add('zoomControl')
				// Список типов карты
					.add('typeSelector')
				// Кнопка изменения масштаба - компактный вариант
				// Расположим её справа
					.add('smallZoomControl', { right: 5, top: 75 })
				// Стандартный набор кнопок
					.add('mapTools');

		});

	});
</script>
PHP:
PHP:
var_dump( preg_split( '/(\{[a-z0-9\_]*\:?[^\}]*\})/si', $template, -1, PREG_SPLIT_DELIM_CAPTURE ) );
Регулярное выражение должно искать такие строки:
{:raram1}
{var_dump:raram2}
{foreach:data_name}
{/foreach}

Но не как не:
{ parammap.sds () {:dsd} }
{
ymaps.geocode('{:adres}

Код:
Array
(
    [0] => <script type="text/javascript">
    var resAlert, myMap;
    ymaps.ready( function() 
    [1] => {
        ymaps.geocode('{:adres}
    [2] => ').then(function(res)
    [3] => {
            var center = res.geoObjects.get(0).geometry.getCoordinates();
            myMap = new ymaps.Map('map',{
                center: center,
                zoom : 15,
                behaviors: ['default', 'scrollZoom']
            }
    [4] => );
            myMap.geoObjects.add(new ymaps.Placemark(center));
            myMap.controls
                // Кнопка изменения масштаба
                    .add('zoomControl')
                // Список типов карты
                    .add('typeSelector')
                // Кнопка изменения масштаба - компактный вариант
                // Расположим её справа
                    .add('smallZoomControl', 
    [5] => { right: 5, top: 75 }
    [6] => )
                // Стандартный набор кнопок
                    .add('mapTools');

        });

    });
</script>
)
Судя по результату, получается не то что задумывалось. Есть предположение что регулярное выражение не правильно работает, т.е. сам php не может адекватно понять как распарсить строку.

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

Фанат

oncle terrible
Команда форума
/оффтопик/
если бы я не был магистром регулярных выражений, то и не стал бы использовать самописный шаблонизатор.
использовал бы РНР, к примеру
 

panika

Новичок
/оффтопик/
если бы я не был магистром регулярных выражений, то и не стал бы использовать самописный шаблонизатор.
использовал бы РНР, к примеру
согласен, но когда есть возможность что-то реализовать независимое, невозможно удержаться от искушения
все работало до тех пор пока регулярное выражение не стало находить совершенно не подходящие строки, от чего обычно у меня начинает болеть голова

Регулярное выражение
Код:
/(\{[a-z0-9\_]*\:?[^\}]*\})/si
Нашло вот такую строку, что не реально потому что там стоит условие [a-z0-9\_] - здесь нет ни пробелов, ни двоеточия, ни запятых
Код:
{ right: 5, top: 75 }
Вопрос, так или иначе, остается открытым. Я просто не верю, что на таком известном форуме никто не знает хотя бы причину подобных явлений.
 

AmdY

Пью пиво
Команда форума
panika
зачем тебе preg_split ?
Нужно либо preg_match*
или для шаблонизаторов лучше preg_replace_callback
 

damner2

Новичок
panika
js лучше вообще не менять из php.
лучше вынести js в отдельный статичный файлик и сделать так, чтоб при инициализации js смотрел на html и брал из него нужные ему данные (например адрес твой и т.д.)
а на странице html писать примерно так:
<div class="map-element" data-address="Красная площадь"></div>
 

panika

Новичок
panika
зачем тебе preg_split ?
Нужно либо preg_match*
или для шаблонизаторов лучше preg_replace_callback
Я все перепробовал, остановился на таком варианте, потому что мне нужно было выстроить древовидную систему шаблона с под-циклами и под-функциями.
А какая собственно разница, разве одно и тоже регулярное выражение не должно искать те же строки во всех случаях?

Я с уважением отношусь ко всем участникам и сторожилам форума, и хотел бы от вас AmdY услышать свои соображения по конкретному вопросу.
Заранее спасибо.
 

Вурдалак

Продвинутый новичок
Нашло вот такую строку, что не реально потому что там стоит условие [a-z0-9\_] - здесь нет ни пробелов, ни двоеточия, ни запятых
Не имеет значения, потому что ты поставил *. Зато все эти пробелы и прочее подходят под
P.S. Ты экранируешь все подряд. Фигурные скобки и двоеточие — не служебные символы.
 

AmdY

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

panika

Новичок
Не имеет значения, потому что ты поставил *. Зато все эти пробелы и прочее подходят под

P.S. Ты экранируешь все подряд. Фигурные скобки и двоеточие — не служебные символы.
Спасибо, выручил. Действительно как только я раскомментировал не служебные символы заметил вопрос после двоеточия и тут понеслось.

Код:
/({[a-z0-9\_]*:[^\}]*}|{\/[a-z0-9\_]+})/i
Конечный вариант который работает. Тему можно закрывать

И вот если кому интересно, класс для реализации шаблонов прикрепляю к сообщению.

/оффтопик/
Вот пример использования:
PHP:
Template::Instance( 'templates/my' )->setTemplate( 'index.main' ); // templates/my/index/main.html
// В след раз в Instance можно не указывать папку с шаблонами

// Можно не указывать первым аттрибутом шалон, если до добавления данных не использовался другой
Template::Instance()->setData( 'index.main' , array(
	'content' => 'Hello, World!'
));

// Первый аттрибут не обязателен, второй true - очистит изменения с шаблоном и его можно будет по новому заполнять
echo Template::Instance()->getTemplate( 'index.main' );
 

Вложения

Сверху