0

我有一段文字,例如:

XYZ id dui vel erat bibendum hendrerit aliquet ac lorem。整数ABC turpis, facilisis sat amet ultricies non, tempor LMNOP est. Aliquam sat amet sapien justo。Quisque TUV dolor dolor,欧盟 sodales mi。

我需要用带编号的占位符替换粗体字。

%%%1%%% id dui vel erat bibendum hendrerit aliquet ac lorem。整数 %%%2%%% turpis, facilisis sit amet ultricies non, tempor %%%3%%% est. Aliquam sit amet sapien justo. Quisque %%%4%%% dolor dolor, eu sodales mi。

进行此替换时,我需要将要替换的文本(例如 XYZ)存储到一个数组中,并键入占位符的编号(例如 1),以便稍后我可以返回并将它们换回原始值。

困难的部分是我事先不知道替换文本,所以我需要一个回调来根据当前已经替换的项目数生成它。

我在旧版本的 PHP 上运行,并且我的工具包中没有可用的匿名函数,所以我相信我仅限于使用preg_replace_callback. 看来我的问题归结为这样一个事实,即我需要创建(使用create_function)的函数才能访问一些共享的全局状态——至少是一个共享的全局数组,我可以在其中推送和弹出被替换的文本到堆。

这可能吗?

4

3 回答 3

1

而不是使用create_function(),您会发现制作常规功能更容易。(不必处理所需的复杂字符串转义更容易。)

用于global $var;设置全局。

然后在运行你的替换访问之后,全局(如果替换调用在一个函数中,你也需要在global $var;那里说)。

于 2011-11-01T22:33:32.047 回答
1

您始终可以传入类方法并使用实例属性(只需查看回调类型)。如果global关键字更适合您的情况,它也是一种可能性。

于 2011-11-01T23:23:44.233 回答
0

如果您使用的是 PHP 5.3,您可以创建一个闭包并在回调中导入本地范围的数据。这避免了全局数据的混乱,同时允许您的回调访问它需要的数据。有关简单示例,请参见以下内容

<?php
// The data you want to use in your function
$data = array(/* ... whatever ... */);

$val = preg_replace_callback('/regex/', function ($matches) use ($data) {
    /* do stuff here with $data and $matches */
});
?>
于 2011-11-01T22:41:48.653 回答