PHP - 带有数组项的括号中的preg_replace项

时间:2010-12-16 03:08:44

标签: php regex preg-replace preg-match-all

我有一个数组:

array('id' => 'really')

我有一个字符串:

$string = 'This should be {id} simple.';

我想最终:

This should be really simple.

我有一个可以使用{id}方面的正则表达式,但我很难做我想做的事。

/{([a-zA-Z\_\-]*?)}/i

{id}可以是任何内容,{foo}或{bar}或与我的正则表达式匹配的任何内容。

我确信目前有一个简单的解决方案可以逃避我。

谢谢,

贾斯汀

3 个答案:

答案 0 :(得分:5)

str_replace比preg_replace快,试试这个:

$arr = array('a' => 'a', 'b' => 'b');
$str = "{a} {b} {c}";
$values = array_values($arr);
$keys = array_keys($arr);

foreach ($keys as $k => $v) {
    $keys[$k] = '{'.$v.'}';
}

str_replace($keys, $values, $str);

答案 1 :(得分:4)

您可以将preg_replacee修饰符一起使用:

$string = preg_replace('/{([a-zA-Z\_\-]*?)}/ie','$arr["$1"]',$string);

Ideone Link

使用e修饰符,您可以在preg_replace的替换部分中包含任何PHP 表达式

为什么你的正则表达式/{([a-zA-Z\_\-])*?}/i不起作用?

您已将*?放在捕获括号( )之外,因此您只捕获{ }中找到的单词的第一个字符。

另请注意,您尚未转发{}这些正则表达式字符用于指定范围量词{num}{min,max}。但在你的情况下,不需要来逃避它们,因为正则表达式引擎可以从上下文推断{}不能用作范围运算符,因为它们没有在他们内部以所需格式编号,因此按字面意思对待他们。

答案 2 :(得分:1)

preg_replace_callback有一个回调选项可以使这种事情成为可能。

function replaceText($matches){
  global $data;
  return $data[$matches[1]];
}
preg_replace_callback(
        '/{([a-zA-Z\_\-])*?}/i',
        'replaceText',
        $content
);

如果您不想使用全局变量,请创建一个类并使用array($object, 'method')回调表示法。