Endzahl aus string entfernen
KarloK.
- php
Hi,
ich komm grad nicht weiter. Brett vorm Kopf.
Aus einem String "t12est234" möchte ich "t12est" machen, allerdings ohne zu wissen, ob ich dabei "234" oder z.B. "223344" abschneiden muß.
$text = preg_replace("/d$/", "", $text);
Klappt nicht. Wer weiß, wieso?
Grüße, KarlK.
Hi,
$text = preg_replace("/d$/", "", $text);
Klappt nicht. Wer weiß, wieso?
weil am Ende kein "d" steht. Wenn Du "\d" meinst, solltest Du dies schreiben - und Dir dessen bewusst sein, dass auch dies nur *eine* Ziffer ist.
Cheatah
weil am Ende kein "d" steht. Wenn Du "\d" meinst, solltest Du dies schreiben - und Dir dessen bewusst sein, dass auch dies nur *eine* Ziffer ist.
Ich sach ja, Brett vorm Kopp.
Danke für beide Hinweise, ab jetzt schaff ichs wieder ;-)
KarloK.
$text = preg_replace("/\d*$/", "", $text);
Gibts eine Möglichkeit, mir das "Ausgeschnittene" als Variableninhalt zurückliefern zu lassen?
Grüße, KK
$text = preg_replace("/\d*$/", "", $text);
Gibts eine Möglichkeit, mir das "Ausgeschnittene" als Variableninhalt zurückliefern zu lassen?
Grüße, KK
preg_match
Eigentlich will ich nämlich, dass die dateien
bild3.jpg
bild4.jpg
bild5.jpg
ins Backup-Verzeichnis kopiert werden.
Sollten diese Dateinamen dort aber schon vorhanden sein, soll ab dem "höchsten Dateinamen" weiter hochgezählt werden.
Beispiel: Im Backup-Verzeichnis gibt es schon
bild3.jpg
bild5.jpg
testbild2.jpg
test4.jpg
photo22.jpg
Dann soll
./bild3.jpg zu ./backup/bild6.jpg werden
./bild4.jpg zu ./backup/bild7.jpg werden
./bild5.jpg zu ./backup/bild8.jpg werden
Mein bisheriger Code:
preg_match("/\d*$/", $datei_ohne_endung, $treffer;
$i=$treffer[0];
$datei_ohne_endung = preg_replace("/\d*$/", "", $datei_ohne_endung);
while (file_exists("./backup/$datei_ohne_endung$i".".$endung")) {
$i++;
}
// in das Backup verschieben
$tofile="./backup/$datei_ohne_endung$i".".$endung";
rename($verzeichnis.$datei, $verzeichnis.$tofile);
Wie kann ich das verbessern? Bisher würde aus bild3.jpg nämlich falscherweise bild4.jpg im Backup.
Ansonsten funktioniert es schon. Es scheitert bisher daran, dass ich nicht die höchste Bild_index_zahl für den entsprechenden Dateinamen herausbekomme.
Grüße, KK
Hallo,
Beispiel: Im Backup-Verzeichnis gibt es schon
bild3.jpg
bild5.jpg
testbild2.jpg
test4.jpg
photo22.jpg
Ansonsten funktioniert es schon. Es scheitert bisher daran, dass ich nicht die höchste Bild_index_zahl für den entsprechenden Dateinamen herausbekomme.
Verschaffe Dir eine Liste der Dateien, die mit Deinem Suchmuster übereinstimmen.
Wenn die Liste nicht leer ist
Sortiere angemessen.
Nimm das größte Element aus dieser Liste.
Schneide das bekannte Präfix ab (in Deinem Beispiel "bild").
Schneide das bekannte Suffix ab (in Deinem Beispiel ".jpg".
bisher höchster Wert := Umwandlung des Restes in eine Integer
(für Robustheit Fehlerprüfung einbauen)
Sonst
bisher höchster Wert := 0
Ende Wenn
Addiere 1 zu dieser Zahl.
Freundliche Grüße
Vinzenz
Hi Vinzenz,
Verschaffe Dir eine Liste der Dateien, die mit Deinem Suchmuster übereinstimmen.
Hab ich.
Wenn die Liste nicht leer ist
Oh. Vergessen. Mach ich noch. ;-)
Gemacht.
Nimm das größte Element aus dieser Liste.
Schneide das bekannte Präfix ab (in Deinem Beispiel "bild").
Schneide das bekannte Suffix ab (in Deinem Beispiel ".jpg".
Beides nicht bekannt. Aber egal. Mach ich mit preg_match.
bisher höchster Wert := Umwandlung des Restes in eine Integer
Brauch ich ja nicht mehr..
(für Robustheit Fehlerprüfung einbauen)
Echt nötig?
Klappt sehr gut bisher.
Danke für die Hilfe.
KK
Hi Vinzenz,
könntest Du vielleicht nochmal einen Blick darauf werfen?
Nicht, dass irgendwo ein Fehler drinne ist und ich mir versehentlich Dateien lösche.
Grüße, Kk
(Hoffentlich klappt die Formatierung)
function dir_rekursiv($verzeichnis)
{
$handle = opendir($verzeichnis);
while ($datei = readdir($handle))
{
if ($datei != "." && $datei != ".." && $datei != "backup")
{
if (is_dir($verzeichnis.$datei)) // Wenn Verzeichniseintrag ein Verzeichnis ist
{
// Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen
dir_rekursiv($verzeichnis.$datei.'/');
}
else
{
$teile = explode(".", $datei);
$datei_ohne_endung=$teile[0];
$endung=$teile[1];
$laenge = strlen($datei_ohne_endung)-1; // string-laenge bestimmen, und
// 1 abziehen, weil bei 0 angefangen
// wird zu zaehlen..
if (($endung != "gif") && (is_numeric($datei_ohne_endung[$laenge])))
{
$datei_ohne_endung = preg_replace("/\d*$/", "", $datei_ohne_endung);
$backupliste = glob("./backup/$datei_ohne_endung*.$endung");
natsort ($backupliste);
$hoechste_dateinummer = array_pop($backupliste);
$teile_hoechste_dateinummer = explode(".", $hoechste_dateinummer);
$datei_ohne_endung_hoechste_dateinummer=$teile_hoechste_dateinummer[1];
preg_match("/\d*$/", $datei_ohne_endung_hoechste_dateinummer, $treffer);
//echo("$datei_ohne_endung_hoechste_dateinummer<br>");
//print_r($treffer);
$i=$treffer[0];
$neuer_index=$i+1;
$tofile="backup/$datei_ohne_endung$neuer_index".".$endung";
echo ("tf: $tofile<br>");
rename($verzeichnis.$datei, $tofile);
}
}
}
}
closedir($handle);
}
$verz="./";
if (!file_exists("$verz/backup"))
{
mkdir("$verz/backup");
}
dir_rekursiv($verz);
echo ("fertig");
Hello,
weil am Ende kein "d" steht. Wenn Du "\d" meinst, solltest Du dies schreiben - und Dir dessen bewusst sein, dass auch dies nur *eine* Ziffer ist.
Ich sach ja, Brett vorm Kopp.
Danke für beide Hinweise, ab jetzt schaff ichs wieder ;-)
*scnr*
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Klappt nicht. Wer weiß, wieso?
was passiert denn?