list2form : gestion des erreurs et des petits fichiers (merci cgi.py…)
[progfou.git] / web / format-with-dict.php
CommitLineData
5c38a355
P
1<?php
2/* petite aide suivant une idée héritée de Python */
3function format_with_dict($str, $dict) {
4 if (!is_array($dict)) {
5 echo "ERROR: second parameter must be a dictionary.\n";
6 return $str;
7 }
8 $result = array();
9 $dict_idx = 0;
10 $offset = 0;
11 $pos = strpos($str, '%', $offset);
12 while ($pos !== false && $pos < strlen($str)-1) {
13 $result[] = substr($str, $offset, $pos-$offset);
14 $offset = $pos + 2;
15 if ($str[$offset-1] == '%') {
16 $result[] = '%';
17 } elseif ($str[$offset-1] == '(') {
18 // $pos = strpos($str, ')', $offset);
19 for ($pos=$offset;$pos<strlen($str)&&(ctype_alnum($str[$pos])||$str[$pos]=='_');$pos++) ;
20 if ($pos < strlen($str)-1 && $str[$pos] == ')') {
21 $var = substr($str, $offset, $pos-$offset);
22 $offset = $pos + 2;
23 if (isset($dict[$var])) {
24 $result[] = $dict[$var];
25 } else {
26 echo "WARNING: '".$var."' not found in dictionary.\n";
27 $result[] = "%(".$var.")s";
28 }
29 } else {
30 echo "ERROR: unterminated format string '".$str."'.\n";
31 $result[] = "%(";
32 }
33 } elseif ($str[$offset-1] == 's') {
34 if ($dict_idx < sizeof($dict)) {
35 $result[] = $dict[$dict_idx];
36 $dict_idx++;
37 } else {
38 echo "WARNING: array index '".$dict_idx."' out of boundary.\n";
39 $result[] = "%s";
40 }
41 } else {
42 // if ($str[$offset] != 's') {
43 echo "WARNING: unsupported format type '".$str[$offset-1]."'.\n";
44 $result[] = "%".$str[$offset-1];
45 }
46 // $result[] = substr($str, $offset, $pos-$offset);
47 $pos = strpos($str, '%', $offset);
48 }
49 $result[] = substr($str, $offset);
50 return implode('', $result);
51}
52/*
53$str = '
54 Nom : %(noms
55 Prenom : %(prenom)s
56 Identité : %(nom_prenom)s
57 Inconnue : %(inconnue)s
58 Résultat : 4%%
59 Champ 1 : %s
60 Champ 2 : %s
61 Champ 3 : %s
62 Fin %d
63';
64$dict = Array('nom'=>'A', 'prenom'=>'JC', 'nom_prenom'=>'JCA', 'c1', 'c2');
65echo "<pre>";
66echo format_with_dict($str, $dict);
67echo "</pre>";
68*/
69?>