$contents) { $contents = preg_replace_callback('@\[(.*?)\]\(#(.*?)\)@', function($data) use($references, $filename, $filerefs) { if(empty($references[$data[2]])) { return $data[0]; } if($references[$data[2]]) { $filepart = $references[$data[2]]; } else { $filepart = $filename; } if(!empty($filerefs[$filepart][$data[2]])) { // replace global ref with local one $refname = $filerefs[$filepart][$data[2]]; } else { $refname = $data[2]; } if($filepart == $filename) { $filepart = ""; } $res = sprintf("[%s](%s#%s)", $data[1], $filepart, $refname); return $res; }, $contents); file_put_contents($filename, $contents); }