【问题标题】:Match, eval and replace BBCode style tags匹配、评估和替换 BBCode 样式标签
【发布时间】:2012-05-10 14:40:23
【问题描述】:

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

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

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

然后我想eval(){{}} 中的所有函数。所以我会评估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 的危险。但是,这些字符串完全来自开发人员,任何用户都无法评估任何内容。)

【问题讨论】:

  • 你的财富 preg_replace_callback
  • 我将这个问题的标题读作“匹配邪恶并替换”。然后看到上面写着BBCode,觉得有点合适。
  • 罗伯特,我同意你的评论。

标签: php regex replace eval bbcode


【解决方案1】:

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

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!."

【讨论】:

  • 我想知道您在哪里评估它...感谢您在编辑中澄清!
  • 没问题:)。无论捕获组捕获什么(在本例中为fox($a);dog($b);),这些字符串都会得到eval'd。
  • 同样的事情对非函数也有效吗?例如。如果我有{{3 + 2;}}{{$somevar;}},它们会被评估然后显示吗?我需要在标签中包含echo 吗?
  • 其实我自己想出来的。它确实有效,不需要echo。显然,甚至分号也是可选的!
  • 好吧,我试着做{{foo('bar')}},现在它说的是Unexpected T_ENCAPSED_AND_WHITESPACE。我猜它在' 上添加了斜线。有什么解决办法吗? :) 非常感谢您的帮助!
【解决方案2】:

如果你只是在这些标签中插入有效的 php - 你可以做一个

$string = '.....';

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

ob_start();
eval($string);
$string = ob_get_clean();

【讨论】:

  • 不错的技巧!但是,弄乱输出缓冲区会发送标头吗?我在 CodeIgniter 助手中执行此操作,我认为您不应该在此处回显任何内容。
  • 输出缓冲区是可嵌套的;如果您在一个输出缓冲区已经启动的情况下启动一个输出缓冲区,那么您的下一个关闭缓冲区命令只会停止最近的缓冲区。
  • 所以不,它不会发送任何标题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多