一个正则表达式,多个替换

时间:2013-05-17 09:38:05

标签: php regex

好的,这就是我的需要:

  • 获取格式为%%something%%的所有条目,如正则表达式/%%([A-Za-z0-9\-]+)%%/i
  • 所示
  • 在给定索引something的情况下,用表中的值替换所有实例。

E.g。

%%something%%替换为$mytable['something']


如果是常规替换,我肯定会选择preg_replace,甚至可以创建一系列可能的替换......但是如果我想让它更灵活一点......

理想情况下,我想要preg_replace($regex, $mytable["$1"], $str);这样的东西,但显然看起来不行......


我应该怎么做?

1 个答案:

答案 0 :(得分:2)

代码:

<?php

$myTable = array(
    'one' => '1!',
    'two' => '2!',
);

$str = '%%one%% %%two%% %%three%%';

$str = preg_replace_callback(
    '@%%(.*?)%%@',
    function ($matches) use ($myTable) {
        if (isset($myTable[$matches[1]]))
            return $myTable[$matches[1]];
        else
            return $matches[0];
    },
    $str
);

echo $str;

结果:

1! 2! %%three%%

如果你不想从下面告诉上层,

<?php

$myTable = array(
    'onE' => '1!',
    'Two' => '2!',
);

$str = '%%oNe%% %%twO%% %%three%%';

$str = preg_replace_callback(
    '@%%(.*?)%%@',
    function ($matches) use ($myTable) {
        $flipped = array_flip($myTable);
        foreach ($flipped as $v => $k) {
            if (!strcasecmp($k, $matches[1]))
                return $v;
        }
        return $matches[1];
    },
    $str
);

echo $str;