2013-11-13 3 views
0

Я хотел бы иметь некоторые макросы на моем сайте, например. [product] milk [/ product], когда он будет показан пользователю, я хочу, чтобы он получил некоторые данные из «молока», изображения, названия продукта, описания продукта.Как сделать на сайте макросы?

EDIT

У меня есть 500+ [продукт] Запись всех из них есть изображение, название продукта, DESC продукт. и если я напишу рецепт, я хочу добавить изображение молока и яиц, используя [продукт] яйцо [/ product] и [product] milk [/ product], и его следует заменить данными сверху ,

Я думал о том, что все это возможно в XML-файле или массиве.

+0

Пытались ли вы что-нибудь самостоятельно? Каков ваш подход? Возможно, это поможет нам понять ваш запрос. –

ответ

0

Если вам нужно общее решение, которое позволит вам заменить [anyTagName] anyContent [/ anyTagName], вы можете попробовать следующий код:

$regex = '/\\[(\\w+)\\](\\w+)\\[\\/\\1\\]/'; 
$content = 'A string with some [product]milk[/product] tags'; 

$parsedContent = preg_replace_callback($regex,function ($matches) { 
    return process_tags($matches[1],$matches[2]); 
},$content); 

function process_tags($tagName,$tagContent) { 
    //What you return from this function will replace the [tagName]tagContent[/tagName] tags. 
    if ($tagName == 'product') { 
     //This is a product tag, return something based on $tagContent 
    } 
} 
+0

Как будет выглядеть регулярное выражение, если бы я хотел иметь ссылку внутри «tagcontent» [product] www.youtube.com?v=something [/ product] –

+0

@BluePanda Это было бы '$ regex = '/ \\ [ (\\ W +) \\] ([^ [] +) \\ [\\/\\ 1 \\]/'; ' – AlliterativeAlice

0

Вот простой пример. Но вы можете проверить существующие реализации парсеров BBCODE. Это могут быть полезные примеры.

function parse_product($input) 
{ 
    if (is_array($input)) { 
     //here you replace macros with desired content 
     return '<span calss="my_product">'.$input[1].'</div>'; 
    } 
} 
return preg_replace_callback($'#\[product](\w+)[/product]#', 'parse_product', $input); 
0

В C макрос является замена синтаксиса, что препроцессор использует как для оптимизации кода (избежать ненужной функции скачок для короткой задачи) и сделать его легко записи для кодировщика. Компонент просто переводит псевдокод (макрос ) в фактический код, когда код компилируется в исполняемый файл. Поскольку PHP не прекомпилирован, я не вижу, как это может быть полезно. Код источника php должен быть предварительно скомпилирован, чтобы получить замену ... Макросы просто не имеют пурпуру во компилированном языке во время выполнения, как в прекомпилированном языках.

Когда я работал над модульной системой, где каждый модуль был файлом с определением объекта . Мне нужно было сделать некоторые глобальные переменные доступными в методе этого объекта (т. Е. Объекта подключения к базе данных) в каждом модуле, но я хотел, чтобы имел список этих переменных только один раз во всей системе (было бы неприятно редактировать все модули если я решил, например, изменить имя любой из этих переменных).

Функция бесполезна в этом случае, поэтому мне нужен макрос.

Я решил проблему так:

// In initialisation part of code 
define('MY_MACRO', 'global $database, $global_config, 
$any_other_needed_variables;'); 

// In beginning of module object's method 
eval (MY_MACRO); 

Но, возможно, есть гораздо лучший способ сделать это

Разница заключается в том, что макросы применяются в виде текста замещения перед тем разбор осуществляются. Это означает, что макросы могут выполнять замену на код, который сам по себе не был бы корректным языком .

Классическим примером неправильного использования этого вида техники в С

#define BEGIN { 
#define END } 

then you can do silly things like: 

for (i = 0; i < 10; i++) 
BEGIN 
printf("%d\n", i); 
END 

Используется рассудительно эти виды техники могут открыть все виды возможностей.

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