alex
10.03.2006, 18:43
Hi,
kennt jemand eine effektiviere Methode aus einem Text, der beliebige Zeichen beinhalten kann, einen gueltigen Dateinamen zu erzeugen. Die einzelen Woerter sollen mit einem Seperator vonenander getrennt sein. Momentan arbeite ich mit folgender Funktion:
/**
* Cleanup text from invalid characters for filename
*
* @param string $name
* @param char $sep
* @return string
*/
function get_filename_from_text($name, $sep)
{
$name = strtolower($name);
$name = str_replace("- ", " ", $name);
$name = str_replace(" ", $sep, $name);
$name = str_replace($sep.$sep, $sep, $name);
// Umlaute
$trans = get_html_translation_table(HTML_ENTITIES);
$trans = array_flip($trans);
$name = strtr($name, $trans);
$name = str_replace("ä", "ae", $name);
$name = str_replace("ö", "oe", $name);
$name = str_replace("ü", "ue", $name);
$name = str_replace("ß", "ss", $name);
$name = str_replace("Ä", "Ae", $name);
$name = str_replace("Ö", "Oe", $name);
$name = str_replace("Ü", "Ue", $name);
// valid characters
$valid = range('A', 'Z');
$valid = array_merge(range('a', 'z'), $valid);
$valid = array_merge(range('0', '9'), $valid);
$valid[] = "-";
$valid[] = ",";
$valid[] = "+";
$valid[] = $sep; // may be a "/"
$valid[] = "_";
$valid[] = " ";
$valid = array_flip($valid);
$max = strlen($name);
$rc_name = "";
for($i=0; $i<$max; $i++)
{
$chr = $name[$i];
if (array_key_exists($chr, $valid))
{
$rc_name .= $chr;
}
}
$rc_name = str_replace("-_", $sep, $rc_name);
$rc_name = str_replace("_-", $sep, $rc_name);
// twice!!!
$rc_name = str_replace($sep.$sep, $sep, $rc_name);
$rc_name = str_replace($sep.$sep, $sep, $rc_name);
return $rc_name;
}
Vor allem stoert mich die For Schleife, mit der die einzelnen Chars ueberprueft werden.
Die einzelnen str_replace lassen sich evenuelle mit preg_replace($pattern, $replace, $string) ersetzen. Ob das allerdings performanter ist, bin ich mir nicht sicher, da im PHP Manuel ja darauf hingewiesen wird, dass man str_replace bevorzugen soll.
Hat jemand einen Verbesserungsvorschlag? Es geht mir vor allem um Performace.
Ciao Alex...
kennt jemand eine effektiviere Methode aus einem Text, der beliebige Zeichen beinhalten kann, einen gueltigen Dateinamen zu erzeugen. Die einzelen Woerter sollen mit einem Seperator vonenander getrennt sein. Momentan arbeite ich mit folgender Funktion:
/**
* Cleanup text from invalid characters for filename
*
* @param string $name
* @param char $sep
* @return string
*/
function get_filename_from_text($name, $sep)
{
$name = strtolower($name);
$name = str_replace("- ", " ", $name);
$name = str_replace(" ", $sep, $name);
$name = str_replace($sep.$sep, $sep, $name);
// Umlaute
$trans = get_html_translation_table(HTML_ENTITIES);
$trans = array_flip($trans);
$name = strtr($name, $trans);
$name = str_replace("ä", "ae", $name);
$name = str_replace("ö", "oe", $name);
$name = str_replace("ü", "ue", $name);
$name = str_replace("ß", "ss", $name);
$name = str_replace("Ä", "Ae", $name);
$name = str_replace("Ö", "Oe", $name);
$name = str_replace("Ü", "Ue", $name);
// valid characters
$valid = range('A', 'Z');
$valid = array_merge(range('a', 'z'), $valid);
$valid = array_merge(range('0', '9'), $valid);
$valid[] = "-";
$valid[] = ",";
$valid[] = "+";
$valid[] = $sep; // may be a "/"
$valid[] = "_";
$valid[] = " ";
$valid = array_flip($valid);
$max = strlen($name);
$rc_name = "";
for($i=0; $i<$max; $i++)
{
$chr = $name[$i];
if (array_key_exists($chr, $valid))
{
$rc_name .= $chr;
}
}
$rc_name = str_replace("-_", $sep, $rc_name);
$rc_name = str_replace("_-", $sep, $rc_name);
// twice!!!
$rc_name = str_replace($sep.$sep, $sep, $rc_name);
$rc_name = str_replace($sep.$sep, $sep, $rc_name);
return $rc_name;
}
Vor allem stoert mich die For Schleife, mit der die einzelnen Chars ueberprueft werden.
Die einzelnen str_replace lassen sich evenuelle mit preg_replace($pattern, $replace, $string) ersetzen. Ob das allerdings performanter ist, bin ich mir nicht sicher, da im PHP Manuel ja darauf hingewiesen wird, dass man str_replace bevorzugen soll.
Hat jemand einen Verbesserungsvorschlag? Es geht mir vor allem um Performace.
Ciao Alex...