2013-04-12 2 views
0

Уважаемые StackOverflow сообщества,PHP: Заменить заполнителей с динамическим числом (разделителей, регулярное выражение)

Я в настоящее время делает свою собственную систему шаблонов для веб-сайта, в котором я могу заменить заполнители шаблона в стиле {$ материала} с php-код. У меня есть следующий код для этого:

/** 
* Replace a default placeholder. 
* 
* @access public 
* @param  string $replace  Placeholder name 
* @param  string $replacement Text with which to replace placeholder. 
* @uses  $leftDelimiter 
* @uses  $rightDelimiter 
* @uses  $template 
*/ 
public function assign($replace, $replacement) { 
    $this->template = str_replace($this->leftDelimiter .$replace.$this->rightDelimiter, 
            $replacement, $this->template); 
} 

leftDelimiter и rightDelimiter в этом случае {$} и, соответственно.

Теперь я хочу добавить новую функцию, которая динамически разбирает заполнители, содержащие числа - скажем, {$ image_1}, {$ image_2}, {$ image_3} и позволяет использовать номера, содержащиеся внутри моего кода замены, например так что я заменил {$ image_1337} записью базы данных mysql из строки с идентификатором «1337».

Как бы я это сделал? Обширный поиск и поиск друзей Google, к сожалению, не помогли мне из-за нехватки кодовой лексики и способности объяснения. Скорее всего, это связано с регулярными выражениями, но я абсолютно не могу обернуть вокруг себя мозг, и все попытки построить подходящий вариант подвели меня.

+0

[preg_replace_callback] (http://php.net/preg_replace_callback) может быть хорошим местом, чтобы начать поиск. – ccKep

+1

Думаю, вам будет лучше смотреть на это несколько иначе. То, что вы делаете, - это не просто назначение шаблонов - вы создаете вспомогательный метод. Поэтому он должен иметь собственный синтаксис. Возможно, что-то вроде {image (1337)}. Конечно, вам все равно нужно добавить новый код, чтобы справиться с этим, но я думаю, что он окупится в долгосрочной перспективе. – RobMasters

ответ

0

Используйте preg_replace вместо str_replace:

preg_replace("/\\{\\\$image_(\d).*?\\}/", "$1", $template) 

Этот простой пример заменяет {$image_2} с 2 и т.д.

Если вам нужно использовать реальную логику вашей замены у вас есть два варианта:

  1. Использовать preg_match_all, чтобы найти все экземпляры рисунка в th e шаблон. Затем вы можете перебирать экземпляры и использовать простой str_replace($match, $your_smart_replacement, $template)

  2. Используйте preg_replace_callback, который позволяет функции обратного вызова сгенерировать замену.

См https://secure.php.net/manual/en/function.preg-replace-callback.php

+0

Редактировать: Добавлены предложения для «умных» замен. –

+0

Мне пришлось использовать первый вариант, потому что второй кажется мне слишком сложным ... с вашим примером, и этот подход работает отлично, спасибо вам большое! Однако теперь я хочу заменить {$, "образ" и} в вашем примере переменными $ this-> leftDelimiter, $ replace и $ this-> rightDelimiter соответственно. Что мне нужно изменить в выражении reg? Эти обратные косы меня убивают ... – ividyon

+0

Применяйте preg_quote к ним, чтобы избежать всех специальных символов, которые они могут содержать. Также, пожалуйста, примите ответ, если это вам помогло :) –

Смежные вопросы