辞書のプレースホルダーを置き換えて文字列を拡張したいとします。置換文字列には、プレースホルダーを含めることもできます。
$pattern = "#a# #b#";
$dict = array("a" => "foo", "b" => "bar #c#", "c" => "baz");
while($match_count = preg_match_all('/#([^#])+#/', $pattern, $matches)) {
for($i=0; $i<$match_count; $i++) {
$key = $matches[1][$i];
if(!isset($dict[$key])) { throw new Exception("'$key' not found!"); }
$pattern = str_replace($matches[0][$i], $dict[$key], $pattern);
}
}
echo $pattern;
たとえば、循環置換パターンがない限り、これは正常に機能します"c" => "#b#"
。その後、メモリが使い果たされるまで、プログラムは無限ループにスローされます。
そのようなパターンを検出する簡単な方法はありますか? 置換間の距離が任意に長くなる可能性があるソリューションを探しています。a->b->c->d->f->a
理想的には、別の分析ではなく、ループ内でも解決策が発生することです。