Preg_replace不仅适用于一个输入

时间:2011-11-25 06:53:11

标签: php regex

我使用preg replace来替换输出中的语法。这是我的代码:

$input_val_Arr = array("ic"=>'8808295663',
                 "promocodereply"=>'123456',
                 "phone"=>'017123456789');

foreach($input_result as $row)
{
    //eg of $row->input_title is promocodereply, phone, ic  

    $special_key =  $row->input_title;

    $rule = "/<".$row->input_title.">/i";

//if(preg_match('/promocodereply/i', $success_msg))

    if(preg_match($rule, $success_msg))
   {
     if(isset($input_val_Arr[$special_key]))
     {                              
      //$success_msg = preg_replace('/<promocodereply>/i', '123456', $success_msg);

      $success_msg = preg_replace($rule, $input_val_Arr[$special_key], $success_msg);   
    }                       
}
}

var_dump($success_msg); 

$ success_msg内容为Success! <PROMOCODEREPLY> <PHONE> <IC>

所以var_dump输出应该是成功! 123456 017123456789 8808295663

然而,ic语法不是替换,这就是我得到的。 Success! 123456 017123456789 <IC>

这是什么问题?感谢。

1 个答案:

答案 0 :(得分:0)

正则表达式很好。但是,您的$input_result数组只包含$row->input_title=="IC"的条目。这将与正则表达式一起使用,但isset($input_val_Arr[$special_key])失败。因为那不是一个不区分大小写的检查。

您需要清理整个方法。多次检查非常冗余,变量名称很糟糕。对于此任务,建议使用单个preg_replace_callback,仅使用/<(IC|PROMOCODEREPLY|PHONE)>/i作为正则表达式。或者使用单个preg_replace调用数组作为主题和替换。