【发布时间】:2014-09-30 21:37:03
【问题描述】:
假设我想通过替换字典中的占位符来扩展字符串。替换字符串也可以包含占位符:
$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
理想情况下,解决方案也将在循环中发生,而不是单独分析。
【问题讨论】:
-
由于您的替换规则集本质上是一个图,您可以应用 DFS 或对其进行拓扑排序以检测循环。
标签: php regex replace cycle-detection