我有一个字符串,其中包含我必须替换的子字符串。子串存储在一个数组中。当我循环遍历数组时,一切正常,直到数组有超过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时,我只得到一个空字符串。
有没有想过为什么会这样?
答案 0 :(得分:1)
尝试这种改进的模式:
$pattern = "~##([a-zA-Z]{2})##.*?\b$find\b.*?##END_\1##|$find~s";
~s
标志表示点(.
)应与换行符匹配。在您的示例中,p
标记被提及。所以我猜它是一个HTML片段。由于新行在html中被分配,我添加了~s
标志。更重要的是,我通过以下方式使模式更具可读性:
/
变为~
,您可以避免逃避任何事情...... [a-zA-Z][a-zA-Z]
变为[a-zA-Z]{2}
##DS## ##END_DS##
。我使用反向引用(\1
)来匹配在第一个匹配组中找到的内容(上图中的第1组)。