Заменить «ключи» в файле данными БД - PullRequest
0 голосов
/ 12 марта 2009

В настоящее время у меня есть следующий способ получения данных из моей БД:

$school->get('studentCount');

Мне потребовался ярлык для доступа к этим полям на странице, и я получил такой формат:

<p>Blah blah blah [[studentCount]]</p>

У меня включена выходная буферизация, но мне просто нужен простой способ замены этого ключа ('[[field-name]]') соответствующими данными из БД.

Если бы это было только одно поле, я мог бы сделать str_replace для вывода следующим образом:

str_replace($output, '[[studentCount]]', $school->get('studentCount'))

К сожалению, это не подходит. Мое идеальное решение - перехватить все, что находится между '[[' и ']]', а затем запустить метод 'get' и заменить весь ключ ('[[...]]') на то, что возвращается.

Ответы [ 6 ]

2 голосов
/ 12 марта 2009

Я почти уверен, что это сработает. :)


<?php
// $output contains the string

preg_match_all('/\[{2}([^\[]+)\]{2}/', $output, $matches);
$replaces = $matches['1'];

foreach($replaces as $replace) $str = str_replace('[['.$replace.']]', $school->get($replace), $output);
?>
2 голосов
/ 12 марта 2009

Ну, вы можете создать два массива, один со строками имени поля [[field-name]] и один с ответами $school->get('field-name'). Затем добавьте их в str_replace, так как он поддерживает массивы.

Пример из руководства по PHP:

$phrase  = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy   = array("pizza", "beer", "ice cream");
$newphrase = str_replace($healthy, $yummy, $phrase);
// Resulting String: "You should eat pizza, beer, and ice cream every day."

Если вы все еще хотите реализовать свое предложение (найти все [[]] и заменить их), я постараюсь написать быструю функцию.

Редактировать: Вот два способа сделать это с помощью вашего запроса:

$html = "Hello, [[FirstName]]!  Welcome to [[SiteName]].";
$count = preg_match_all("/\[\[([\w]+)\]\]/", $html, $matches);
for ($x = 0; $x < $count; $x++)
  $html = str_replace($matches[0][$x], $school->get($matches[1][$x]), $html);

Или используя массивы:

$html = "Hello, [[FirstName]]!  Welcome to [[SiteName]].";
$count = preg_match_all("/\[\[([\w]+)\]\]/", $html, $matches);
for ($x = 0; $x < $count; $x++)
  $matches[1][$x] = $school->get($matches[1][$x]);
$html = str_replace($matches[0], $matches[1], $html);
1 голос
/ 12 марта 2009

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

function cache_it($filename, $tablvar) {
    $tmplt = file_get_contents($filename);
    $tmplt = preg_replace('/\[\[(.+)\]\]/', 
             '<?php echo $' . $tablevar . '->get(\1);?>',
             $tmplt);
    file_put_contents($filename . '.php', $tmplt);
}

Тогда всякий раз, когда вам нужно получить доступ к файлу.

function print_it($filename, $tablevar, $table) {
    $_GLOBAL[$tablevar] = $table;
    include $filename . '.php';
    unset($_GLOBAL[$tablevar]);
}

Возможно, вы хотите проверить, что дата создания кэшированного файла больше, чем дата последнего изменения исходного файла. Заключение этого и двух вышеприведенных функций в классе помогает избежать многих маленьких подводных камней. Но общая идея звучит здраво. Есть также некоторые проблемы безопасности с файлом кеша, являющимся .php-файлом, к которому вам нужно будет обратиться.

Я добавил кэширование этого шаблона стиля в OSS CMS, над которой я работаю. Кэшируя результаты регулярных выражений, мы ускорили исходный код более чем на 50%. Настоящее преимущество заключается в том, что шаблоны представляют собой файлы PHP. Поэтому все, что ускоряет интерпретацию PHP-файлов (APC, eAccelerator и т. Д.), Также ускоряет ваши шаблоны.

1 голос
/ 12 марта 2009

Вам нужно будет использовать регулярное выражение, чтобы найти вещи внутри двух [[и]] и взять вставку между ними в вашу функцию -> get ().

Функция будет preg_replace

http://us2.php.net/preg-replace

0 голосов
/ 12 марта 2009

Спасибо за ответы до сих пор. Я задумывался об использовании str / preg _replace с массивами, но хотел, чтобы ключ ([[...]]) напрямую связывался с методом get, чтобы он был полностью расширяемым. Я не хочу добавлять в два разных массива каждый раз, когда в БД добавляется новое поле.

Например, в JavaScript я достиг бы этого следующим образом: (JavaScript позволяет передавать анонимную функцию в качестве параметра 'замена' в ее эквиваленте preg_replace):

('this is the output blah blah [[studentCount]]').replace(/\[{2}([^\[]+)\]{2}/g, function($0, $1) {
    get($1);
})
0 голосов
/ 12 марта 2009

Вам нужно написать парсер, чтобы просмотреть вывод $, чтобы найти то, что находится между вашими разделителями, а затем вызвать функцию, если она определена. Я предполагаю, что вы хотите сделать это таким образом, чтобы сохранить вызовы, пока они не понадобятся. Я написал анализатор шаблонов, который эффективно работал таким образом. К сожалению, этого не было в PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...