我有一个数组:
array('id' => 'really')
我有一个字符串:
$string = 'This should be {id} simple.';
我想最终:
This should be really simple.
我有一个可以使用{id}方面的正则表达式,但我很难做我想做的事。
/{([a-zA-Z\_\-]*?)}/i
{id}可以是任何内容,{foo}或{bar}或与我的正则表达式匹配的任何内容。
我确信目前有一个简单的解决方案可以逃避我。
谢谢,
贾斯汀
答案 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_replace
与e
修饰符一起使用:
$string = preg_replace('/{([a-zA-Z\_\-]*?)}/ie','$arr["$1"]',$string);
使用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')
回调表示法。