PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aus Textblock einen gültigen Dateinamen erstellen



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...

Asche
10.03.2006, 19:56
Ich denke preg_replace wäre hier eigentlich die bessere Wahl als ein Stapel str_replace und die for-Schleife... Ich schätze das die Perfomance bei kurzen zu bearbeitenden Dateinamen in etwa gleich ist, aber bei längeren bist du mit preg_replace schneller dran.

alex
11.03.2006, 09:41
Hi,

ich habe da einen ganz interessanten neuen Ansatzt gefunden mit:



$sep = "-"
$text = preg_replace("/(\W)/e", "'\\1'==' '?'$sep':''", $text);


Damit bekomme ich einen String, der nur alphanumerische Zeichen enthaelt und die Leerzeichen werden durch den gewuenschen Seperator ersetzt.

Und hiermit entferne ich die doppelten Seperatoren


$text = preg_replace("/(\\$sep){2,}/", $sep, $text);


Soweit alles ganz wunderbar. Ich habe nur ein Problem das erste preg_replace mit weiteren gueltigen Zeichen zu erweitern, die im Text beinhalten sein duerfen wie "_,+/"

Kann mir da jemand auf die Spruenge helfen?

Das komplette Funktion schaut dann bis jetzt so aus:



/**
* Cleanup text from invalid characters for filename
*
* @param string $text
* @param char $sep
* @return string
*/
function get_filename_from_text($text, $sep)
{
$text = strtolower(strip_tags($text));

// convert umlaute
$text = preg_replace( array( "'&auml;'",
"'ä'",
"'&ouml;'",
"'ö'",
"'&uuml;'",
"'ü'",
"'&szlig;'",
"'ß'"),
array( "ae",
"ae",
"oe",
"oe",
"ue",
"ue",
"ss",
"ss"),
$text);

$valid_chars = "-,+_:"; // die fehlen mir noch

// remove invalid characters
$text = preg_replace("/(\W)/e", "'\\1'==' '?'$sep':''", $text);

// remove double seps
$text = preg_replace("/(\\$sep){2,}/", $sep, $text);

return $text;
}


Ciao Alex...

Asche
11.03.2006, 16:43
versteh ich nich? es wird doch gar nicht nach eines der Zeichen "-,+_:" gesucht, also wird doch auch keines der Zeichen ersetzt, oder doch?

alex
11.03.2006, 18:12
Hi,

so wie ich es jetzt in der neuen Funktion habe sind nur alphanumerische Zeichen und ein Seperator erlaubt. Wenn ein z.B. ein "%" oder "+" vorkommt, wird dieses Zeichen entfernt.
So soll es ja auch sein, aber ich moechte, dass die Zeichen in $valid_chars erlaubt sind, also nicht gefiltert werden.

Ciao Alex...

__dejan__
11.03.2006, 18:46
Ich habe es nciht getestet und hatte auch lange nix mehr mir regexp zu tun, aber versuchs mal
$text = preg_replace("/([^\w\-,+_:])/e", "'\\1'==' '?'$sep':''", $text);

alex
11.03.2006, 19:19
Hi __dejan__,

funktioniert leider nicht.

Ciao Alex...

Figurehead
11.03.2006, 19:39
Original von __dejan__
Ich habe es nciht getestet und hatte auch lange nix mehr mir regexp zu tun, aber versuchs mal
$text = preg_replace("/([^\w\-,+_:])/e", "'\\1'==' '?'$sep':''", $text);

Dejan's Lösung sollte funktionieren, allerdings kann man das '_' weglassen, weil dieses Zeichen schon in der Zeichenklasse '\w' enthalten ist. Wichtig ist bei seiner Lösung das KLEINE! '\w' zu benutzen, nicht '\W'


$text = preg_replace("/([^\w\-,+:])/e", "'\\1'==' '?'$sep':''", $text);

alex
11.03.2006, 19:51
Hi Figurehead,

Deine Tipp war richtig, ich habe wirklich \W verwendet, mit \w funktioniert es 1a!

Thanx!

Ciao Alex...

Figurehead
11.03.2006, 19:52
Wusste ich's doch ;)

bbsall4511
23.07.2011, 06:21
Online wholesale ralph lauren (http://www.ralphnow.com/) has become a popular, Online buy wholesale ralph lauren shirts (http://www.ralphnow.com/Wholesale-ralph-lauren-shirts_c4) not only the preferential price, good quality, can want to buy customers save money,Let the customer can need not go out can have fashionable wholesale polo big and tall shirts (http://www.ralphnow.com/Wholesale-ralph-lauren-shirts-ralph-lauren-big-tall_c9) and wholesale polo shirts (http://www.ralphnow.com/Wholesale-ralph-lauren-shirts_c4) etc.