0

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

编辑

我有 500 多个 [产品] 条目,它们都有图像、产品名称、产品描述。如果我写一个食谱,我希望能够通过使用 [product]egg[/product] 和 [product]milk[/product] 添加牛奶和鸡蛋的图像,并且应该用上面的数据替换它.

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

4

3 回答 3

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

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

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

在 C 中滥用这种技术的典型例子是

#define BEGIN {
#define END }

then you can do silly things like:

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

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

于 2013-11-13T16:03:49.167 回答
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);
于 2013-11-13T15:54:45.670 回答
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
    }
}
于 2013-11-13T16:11:26.313 回答