Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: RegEx Problem

  1. #1
    Wilstedter Apfel
    Themenstarter
    Avatar von Slashwalker
    Registriert
    05.2006
    Beiträge
    1.934

    RegEx Problem

    RegEx waren noch nie mein Ding
    Ich brauch eine RegEx für folgende Situation:
    Auf einer Website sollen Bilder/PDF hochgeladen werden. Diese sollen nach dem Upload duplizierbar sein.
    Daher wird beim ersten duplizieren aus test.jpg test_copy_123456.jpg wobei 123456 für eine Art timestamp steht (tickcount), da dieser wirklich immer einzigartig ist.

    Soweit so gut. Wenn ich jetzt das Bild test_copy_123456.jpg duplizieren will muss es ja wieder neu benannt werden.
    Daher bräuchte ich eine RegEx, die genau den String _copy_ sowie [0-9] findet. Mit "_copy_[0-9]" funktioniert es nicht, ebensowenig mit "[_copy_0-9]". Zweitere würde zwar funktionieren, findet allerdings auch das p in jpg

    Lässt sich sowas überhaupt mit RegEx bewerkstelligen? Any idea?
    VAYA CON TIOZ
    Helden leben lange -Legenden sterben nie!
    La Ultima Cerveza!


  2. #2
    Englischer Kantapfel Avatar von _linx_
    Registriert
    01.2009
    Alter
    19
    Beiträge
    1.086
    Code:
    //([^_]*)_([^_]*)_([^_]*)/

  3. #3
    Wilstedter Apfel
    Themenstarter
    Avatar von Slashwalker
    Registriert
    05.2006
    Beiträge
    1.934
    Geht leider nicht, da wird bei duplizieren von test_copy_123456.jpg ein test_copy_123456_copy_123456.jpg draus.

    Ich muss glaub ich mal bissel mehr Infos rausrücken

    Code:
    <cfset x=gettickcount()>
    <cfset newname=rereplace(session.cfoshoppingcard.special[attributes.pid].img[attributes.dupliziere].name,"//([^_]*)_([^_]*)_([^_]*)/","","All")>
    
    <cfset newname=listfirst(newname,".")&"_copy_"&x&"."&listlast(newname,".")>
    <cffile action="rename" destination="#expandpath('.')#/uploads/#session.id#/#newname#" source="#expandpath('.')#/uploads/#session.id#/#session.cfoshoppingcard.special[attributes.pid].img[attributes.dupliziere].name#">
    Zeile 1 setzt einen neuen Tickcount, der einmalig ist.
    In Zeile 2 wird der in der Session gespeicherte Dateiname nach der RegEx durchsucht und diese entfernt.
    In Zeile 3 wird der neue Name, der nun kein _copy_123456 mehr enthalten sollte, neu zusammengesetzt.
    Hierzu wird der Name als Liste behandelt, deren Seperator der Punkt ist. Listfirst liefert also den Dateinamen und Listlast die Dateiendung. Dazwischen wird der String _copy_ und die Variable X eingefügt.
    VAYA CON TIOZ
    Helden leben lange -Legenden sterben nie!
    La Ultima Cerveza!


  4. #4
    Rhode Island Greening Avatar von Steinchen
    Registriert
    04.2010
    Ort
    Saarland
    Beiträge
    472
    Hi,

    wenn ich als Grundlage ein "test_123456.jpg" nehme und daraus dann ein "test_copy_123456.jpg" machen will stellt sich mir die Frage warum es kein "copy_test_12345.jpg" oder "test_12345_copy.jpg" sein kann. Antwort: Ist zu einfach

    Aber machs dir doch nicht so schwer, gibt auch einfacherer Lösungen:

    Aus "test12345.jpg" wird "test_12345_copy.jpg":

    Code:
    $newfilename = basename("test_12345.jpg",".jpg") + "_copy.jpg";
    Du kannst natürlich auch einfach mittels Regexp die Zahlen suchen, sowas z.B.:

    "([:digit:]*)".

    Funktioniert prima in sed:

    Code:
    mac:~ steinchen$ echo "test_123_bleh.jpg" | sed -E -e 's/([[:digit:]]*)//g'
    test__bleh.jpg
    mac:~ steinchen$
    cu
    They have this game where you put in a dollar and win four quarters! I win every time!

  5. #5
    Wilstedter Apfel
    Themenstarter
    Avatar von Slashwalker
    Registriert
    05.2006
    Beiträge
    1.934
    Hallo Steinchen, die Grundlage ist test.jpg nicht test_123456.jpg
    Das Problem ist, das auch Kopien von der Kopie der Kopie der Kopie ... möglich sein sollen. Daher auch der tickcount, damit sichergestellt ist dass es einen Dateinamen nur einmal geben kann. Dazu kommt natürlich noch, das ich vorher nicht weiß, wie die Dateien heißen werden, da diese von Usern hochgeladen werden.

    Ziel ist also beim Beispiel test.jpg, das alle Kopien, egel ob direkt oder Kopie von der Kopie
    test_copy_tickcount.jpg heißen sollen. Wobei tickcount eine Zahlenfolge ist, die im Prinzip dem Unix timestamp ähnelt und daher immer einzigartig ist.
    VAYA CON TIOZ
    Helden leben lange -Legenden sterben nie!
    La Ultima Cerveza!


  6. #6
    Seestermüher Zitronenapfel
    Registriert
    11.2006
    Ort
    Ruhrgebiet und Niederrhein
    Beiträge
    6.085
    Wie werden die Dateien denn hochgeladen? per PHP und Webinterface?
    Viel Technik als Mittel zum Zweck....
    23 weis alles, 42 ist die Antwort und 242 steht außer Frage
    Ich danke euch allen. Selten so gut gelacht.
    Wer Ironie findet, darf sie behalten/RTFM
    Bei der Lösungssuche: selbst mitdenken hilft auch.
    Welle:Erdball - Nur tote Frauen sind schön - Lieber Gott


  7. #7
    Wilstedter Apfel
    Themenstarter
    Avatar von Slashwalker
    Registriert
    05.2006
    Beiträge
    1.934
    ColdFusion und jQuery, da Multiupload. Aber die Technik ist ja erstmal zweitrangig. es fehlt an der passenden RegEx.
    VAYA CON TIOZ
    Helden leben lange -Legenden sterben nie!
    La Ultima Cerveza!


  8. #8
    Rhode Island Greening Avatar von Steinchen
    Registriert
    04.2010
    Ort
    Saarland
    Beiträge
    472
    Hi,

    ich glaub die Technik ist hier mitunter entscheidend. Ich würde mir einen Hash per Zufall erzeugen un diesen als Dateinamen benutzen. Auch bei Kopien o.ä. Damit umgehst du all deine Probleme.

    Den Namen würde ich dann in der DB verlinken und fertig.

    cu
    They have this game where you put in a dollar and win four quarters! I win every time!

  9. #9
    Wilstedter Apfel
    Themenstarter
    Avatar von Slashwalker
    Registriert
    05.2006
    Beiträge
    1.934
    Also ich hab die RegEx jetzt zumindest soweit, das sie wirklich das vollständige wort sucht:
    [(_copy_)0-9]

    Allerdings müsste ich jetzt noch sagen können, das Zahlen nur nach dem Wort entfernt werden. Derzeit ist es so:
    Aus IMG_0014.JPG wird beim duplizieren IMG_xl_copy_1274616989028.JPG. Es werden also alle Ziffern entfernt.
    Wenn ich danach dann IMG_xl_copy_1274616989028.JPG dupliziere wird daraus IMG_xl_copy_1274616982771.JPG

    Es scheitert nun also nur noch daran, dass alle Ziffern entfernt werden, statt nur derer, die auf _copy_ folgen.
    VAYA CON TIOZ
    Helden leben lange -Legenden sterben nie!
    La Ultima Cerveza!


  10. #10
    Rhode Island Greening Avatar von Steinchen
    Registriert
    04.2010
    Ort
    Saarland
    Beiträge
    472
    Zitat Zitat von Slashwalker Beitrag anzeigen
    Also ich hab die RegEx jetzt zumindest soweit, das sie wirklich das vollständige wort sucht:
    [(_copy_)0-9]

    Allerdings müsste ich jetzt noch sagen können, das Zahlen nur nach dem Wort entfernt werden. Derzeit ist es so:
    Aus IMG_0014.JPG wird beim duplizieren IMG_xl_copy_1274616989028.JPG. Es werden also alle Ziffern entfernt.
    Wenn ich danach dann IMG_xl_copy_1274616989028.JPG dupliziere wird daraus IMG_xl_copy_1274616982771.JPG

    Es scheitert nun also nur noch daran, dass alle Ziffern entfernt werden, statt nur derer, die auf _copy_ folgen.
    Hä?

    Nur die Ziffern entfernen die auf Copy folgen und alle anderen stehen lassen? Wo in deinem Beispiel ist denn ein Name wo Ziffern *VOR* copy stehen.

    Ich denke du hast hier ein hausgemachtes Problem das sich viel einfacher lösen lassen würde die das, was du da vor hast.

    Einfach mal nicht um die Ecke denken hilft.

    cu
    They have this game where you put in a dollar and win four quarters! I win every time!

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •