2

所以在我的PHP代码中我有一个这样的字符串;

The quick brown {{fox($a);}} jumped over the lazy {{dog($b);}}.

现在听起来可能很奇怪,但我想遍历字符串,并收集所有 BBCode 样式标签。

然后我想要'seval()里面的所有函数。{{}}所以我会评估fox($a);dog($b);.

这两个函数都返回一个字符串。我想用各自的结果替换各自的标签。所以假设fox()返回“vulpes vulpes”并dog()返回“canis lupus”,我的原始字符串将如下所示;

The quick brown vulpes vulpes jumped over the lazy canis lupus.

但是,众所周知,我对正则表达式很糟糕,我不知道该怎么做。

任何的建议都受欢迎!

(是的,我知道happy-go-lucky eval()ing的危险。但是,这些字符串完全来自开发人员,没有用户能够评估任何东西。)

4

2 回答 2

3

如果您想使用正则表达式执行此操作,这里有一个似乎对我有用的解决方案:

function fox( $a) { return $a . 'fox!'; }
function dog( $b) { return $b . 'dog!'; }

$a = 'A'; $b = 'B';
$string = 'The quick brown {{fox($a);}} jumped over the lazy {{dog($b);}}.';
$regex  = '/{{([^}]+)+}}/e';
$result = preg_replace( $regex, '$1', $string);

正则表达式非常简单:

{{       // Match the opening two curly braces
([^}]+)+ // Match any character that is not a closing brace more than one time in a capturing group
}}       // Match the closing two curly braces

当然,/e修饰符会导致替换为eval'd,从而产生:

输出:

var_dump( $result);
// string(49) "The quick brown Afox! jumped over the lazy Bdog!."
于 2012-04-30T22:45:30.700 回答
1

如果您只是在这些标签中插入有效的 php - 您可以执行

$string = '.....';

$string = '?>' . $string;
$string = str_replace('{{', '<?php echo ', $string);
$string = str_replace('}}', '?>', $string);

ob_start();
eval($string);
$string = ob_get_clean();
于 2012-04-30T22:39:44.230 回答