0

我有一组基于文本的规则,其结构如下:

规则一:当[PN]大于[N]时做[XXX]
规则 2:获取 [PRD ..] 并添加 [X.XX]

与此相关的是一组数据,它将每个分组的代码转换为 CSS 类 ID(用于 jQuery)。

我还有一个从 [ code ] 到 ID 的翻译数组,存储在一个简单的结构化数组中,如下例所示:

$translate = array(
    'XXX' => 'gen-string-input', 
    'PN' => 'gen-positivenumber-input',
    'N' => 'gen-number-input'
);

重要的是可以实现以下目标:

我需要用结构如下的 span 标签 替换 [ code ] 的每个实例:

<span class="[classname]" unique="[hash]" offset="[offset]">[CODE]</span>

这是假设字段是

  • classname是 $translate 数组的结果
  • hash是一个 md5 散列,对于每个规则都是静态的
  • offset是字段在字符串中的位置(例如,在第一个示例中,字段[XXX]位于位置 0,[PN]位于位置 1,依此类推)。

基于此信息,我希望为Rule 1实现以下输出:

<p>
    Do <span class="gen-string-input" 
             unique="[md5]"
             offset="0">[XXX]</span>
    when <span class="gen-positivenumber-input"
               unique="[md5]" 
               offset="1">[PN]</span>
    greater than <span class="gen-number-input" 
                       unique="[md5]" 
                       offset="2">[N]</span>
</p>

非常感谢任何帮助,我目前正在使用 str_replace 来尝试实现这一目标,但这还不够好。

4

2 回答 2

0

好的,实际上您需要的是preg_replace_callback. 请参阅递归回调示例。

于 2009-03-25T17:27:16.067 回答
0

遍历 translate 数组,将字符串中的键替换为值

$string = '[代码]';
$translate = array('classname' => 'oddRow', 'hash' => 'abcdef');

foreach($translate AS $key=>$value)
{
$string = str_ireplace('[' . $key . ']', $value, $string);
}
于 2009-03-25T17:42:19.493 回答