循环数组并用regex替换返回空字符串

时间:2014-01-13 11:08:37

标签: php regex foreach

我有一个字符串,其中包含我必须替换的子字符串。子串存储在一个数组中。当我循环遍历数组时,一切正常,直到数组有超过120个条目。

foreach ( $activeTags as $k => $v ) {
  $find = $activeTags[$k]['Tag']['tag'];
  $replace = 'that';
  $pattern = "/\#\#[a-zA-Z][a-zA-Z]\#\#.*\b$find\b.*\#\#END_[a-zA-Z][a-zA-Z]\#\#|$find/"; 
  $sText = '<p>Do not replace ##DS## this ##END_DS## replace this.</p>';

  $sText = preg_replace_callback($pattern, function($match) use($find, $replace){
    if($match[0] == $find){
      return($replace);
    }else{
      return($match[0]);
    }
  }, $sText);
}

当count($ activeTags)== 121时,我只得到一个空字符串。

有没有想过为什么会这样?

1 个答案:

答案 0 :(得分:1)

尝试这种改进的模式:

$pattern = "~##([a-zA-Z]{2})##.*?\b$find\b.*?##END_\1##|$find~s";

描述

Regular expression visualization

讨论

~s标志表示点(.)应与换行符匹配。在您的示例中,p标记被提及。所以我猜它是一个HTML片段。由于新行在html中被分配,我添加了~s标志。更重要的是,我通过以下方式使模式更具可读性:

  • 使用自定义图案边界:/变为~,您可以避免逃避任何事情......
  • 替换重复的子模式:[a-zA-Z][a-zA-Z]变为[a-zA-Z]{2}
  • 利用序列##DS## ##END_DS##。我使用反向引用(\1)来匹配在第一个匹配组中找到的内容(上图中的第1组)。