Moin!
Aktuell benutze ich (nach dieser Anleitung) die in PHP hinterlegten Werte (DateTimeZone::listIdentifiers), um daraus dynamisch eine Auswahlliste zu erzeugen:
Das ist vermutlich der grausamste Code, den man schreiben kann, um so eine Liste zu erstellen. Der verwendet ja an nahezu JEDER Stelle reguläre Ausdrücke nur deshalb, weil man's kann - und dies keinesfalls effizient.
Mein persönlicher Favorit ist, wie zu Beginn grandios ein "Template" für das Select-Feld definiert wird, und am Ende mit einem recht opulenten regulären Ausdruck die erzeugte Optionsliste hineingequetscht wird. WTF?
Weiteres Highlight: Mit dem ERSTEN regulären Ausdruck suchen, ob eine Zeitzone zu einer der gewünschten Regionen gehört, und dann mit einem ZWEITEN regulären Ausdruck Region und Zone trennen. Und dies auch noch mit einem STATISCHEN Zeichen.
Stattdessen im ersten Ausdruck die derzeit schon vorhandenen Klammern zu benutzen, um den dort gefundenen Ausdruck danach wiederzuverwenden (und man könnte dann auch noch Klammern für den zweiten Teil einfügen) war wohl abwegig:
if (preg_match( '~^(America|Antartica|Arctic|Asia|Atlantic|Europe|Indian|Pacific)/(.*)$~', $v, $e)) {
$e; // schon fertig, der erste Teil steht allerdings in $e[1], nicht in [0], der zweite in [2], nicht in [1]. In [0] steht der gesamte String
$template = '<select name="timezones"></select>';
$timezone_list = '';
$c = '';foreach (DateTimeZone::listIdentifiers() as $v) {
if (preg_match( '~^(America|Antartica|Arctic|Asia|Atlantic|Europe|Indian|Pacific)/~', $v)) {
$e = preg_split('~/~', $v, 2, PREG_SPLIT_NO_EMPTY); // obtain continent, cityif ($c != $e[0]) {
if (!empty($c)) {
$timezone_list .= '</optgroup>';
}$timezone_list .= sprintf(
'<optgroup label="%s">',
htmlspecialchars($e[0])
);
}$city = $e[1];
$c = $e[0];$timezone_list .= sprintf(
'<option value="%1$s">%2$s</option>',
htmlspecialchars($v),
htmlspecialchars($city)
);
}
}$timezone_list = sprintf('%s</optgroup>', $timezone_list);
$template = preg_replace(
'~(?is)(<select .?name="timezone".?>[\r\n])~',
'$1'.$timezone_list,
$template
);
- Sven Rautenberg