如何制作网站宏?

时间:2013-11-13 15:47:27

标签: php mysql

我想在我的网站上有一些宏,例如。 [产品]牛奶[/产品],当它向用户显示我希望它从“牛奶”,图像,产品名称,产品描述中获取一些数据。

修改

我有500多个[产品]条目,所有条目都有图像,产品名称,产品说明。如果我写了一个配方,我希望能够添加牛奶和鸡蛋的图像,使用[产品]鸡蛋[/产品]和[产品]牛奶[/产品],它应该用上面的数据替换。

我想过把它全部放在xml文件或数组中。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

在C中,宏是预编译器用于优化代码的语法替换 (避免短期任务的不必要的功能跳转)并使其变得容易 为编码员写信。编译器简单地翻译伪代码( 当代码被编译为可执行代码时,实际代码。因为PHP是 没有预编译,我不知道这有什么用。 php源码 代码应该预编译,以获得替换...宏只是没有 有一个运行时编译语言的purpouse,就像在预编译中一样 语言。

当我在使用模块化系统时,每个模块都是一个文件 对象定义。我需要在这个方法中使一些全局变量可访问 每个模块中的对象(即数据库连接对象),但我想要 在整个系统中只有一次这些变量的列表(它会是 如果我决定更改名称,那么编辑所有模块会很不愉快 任何这些变量)。

在这种情况下,函数没用,所以我需要一个宏。

我用这种方式解决了问题:

// 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);

但也许有更好的方法来做到这一点

不同之处在于宏之前被应用为文本替换 进行解析。这意味着宏可以执行 代码上的替换本身不是有效的语言 构造

在C中滥用此类技术的典型例子是

#define BEGIN {
#define END }

then you can do silly things like:

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

明智地使用这些技术可以打开各种各样的技术 可能性。

答案 2 :(得分: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
    }
}