在文本中搜索特殊字符串并替换为数组中的内容

时间:2011-03-20 14:01:44

标签: php regex

考虑这个文本

$text = 'bla bla bla bla (=abc) bla bla bla bla (=var.var)';

{C}有两个特殊值(=abc)(=var.var)

我需要用这个数组中的值替换它们:

$array['abc']='word1';
$array['var.var']='word2';

基本上在模式中是(= [a-z。] +)(字符a-z和点)。

我需要的结果:bla bla bla bla *word1* bla bla bla bla *word2*(没有*)

我试了这个没有运气

preg_replace('/\(=([a-z\.]+)\)/',"$array['\\1']",$text);

解析错误:语法错误,意外T_ENCAPSED_AND_WHITESPACE,在第9行的D:\ net \ test \ index.php中期待T_STRING或T_VARIABLE或T_NUM_STRING

2 个答案:

答案 0 :(得分:3)

由于替换字符串无法从匹配内容中派生(它涉及$array中的外部数据,因此您需要使用preg_replace_callback

此示例假定PHP 5.3为匿名函数,但您可以在任何PHP版本中使用create_function执行相同操作(以稍微繁琐的方式)。

$text = 'bla bla bla bla (=abc) bla bla bla bla (=var.var)';
$array['abc']='word1';
$array['var.var']='word2';

$result = preg_replace_callback(
            '/\(=([a-z\.]+)\)/', 
            function($matches) use($array) { return $array[$matches[1]]; },
            $text);

答案 1 :(得分:2)

< PHP 5.3解决方案:)

$text = 'bla bla bla bla (=abc) bla bla bla bla (=var.var)';

$text = preg_replace_callback('/\(=([\w.]+?)\)/', 'processMatches', $text);

function processMatches($matches) {
    $array = array();
    $array['abc']='word1';
    $array['var.var']='word2';
    return isset($array[$matches[1]]) ? $array[$matches[1]] : '';
}

var_dump($text); // string(43) "bla bla bla bla word1 bla bla bla bla word2"

CodePad