fragment.
Fragments are delimited like this:
¤¤ name 1 ¤¤
fragment 1
¤¤ name 2 ¤¤
fragment 2
¤¤ name 3 ¤¤
fragment 3
The first delimiter and name ('¤¤ name 1 ¤¤' in the above example) can
be omitted, in which case the first fragment will be assigned the
name 'base'. All other fragments must be named.
Throws an exception if:
- any fragment except the first is missing a name
- two (or more) fragments share a name
*/
function get_fragments($infile) {
$out = array();
$name = '';
$current_fragment = '';
$filecontents = file($infile);
$iter = 0;
foreach($filecontents as $line) {
if(strpos(trim($line), '¤¤') === 0) {
if($iter != 0) {
$out = try_adding($name, $current_fragment, $out, $infile);
}
$name = trim($line, "\t\n\r ¤");
$current_fragment = '';
} else {
$current_fragment .= $line;
}
$iter++;
}
return try_adding($name, $current_fragment, $out, $infile);
}
function try_adding($key, $value, $array, $filename) {
if(array_key_exists($key, $array)) {
throw new Exception('There is already a fragment with that name in '.$filename);
} else if($key === '') {
throw new Exception('There is an unnamed fragment in '.$filename);
}
$array[$key] = trim($value);
return $array;
}
/*
Takes an associative array and a string.
Returns a string.
Replaces each occurrence of each array key in the input string
with the associated array value, and returns the result.
*/
function replace($assoc_arr, $subject) {
$keys = array();
$values = array();
foreach($assoc_arr as $key => $value) {
$keys[] = '¤'.$key.'¤';
$values[] = $value;
}
return str_replace($keys, $values, $subject);
}
?>