Zum Inhalt springen

computercrustie

Mitglieder
  • Gesamte Inhalte

    207
  • Benutzer seit

  • Letzter Besuch

Beiträge von computercrustie

  1. Mit css kannst du das auch realisieren:

    
    <html>
    
    <head>
    
    <style type="text/css">
    
    input.button 
    
    {
    
      border: none;
    
      background-image: url('grafik.gif');
    
      width: 100px;
    
      height: 40px;
    
      cursor: pointer;
    
    }
    
    </style>
    
    </head>
    
    <body>
    
    <form action="#">
    
    <input type="text" value="test" />
    
    <input type="reset" value="Zurücksetzen" class="button" />
    
    </form>
    
    </body>
    
    </html>
    
    

  2. preg_replace($pattern,$replace,$text) führt eine Ersetzung in $text von einem regulären Ausdruck $pattern durch $replace aus.

    In unserem Fall liegt das Datum als tt.mm.yyyy vor, wobei die drei Bestandteile durch Punkte getrennt sind.

    Demzufolge muss der reguläre Ausdruck so aussehen:

    
    /(\d.*?).(\d.*?).(\d.*?)$/
    
    

    (\d.*?). findet eine Zahlen bis zum Punkt und erzeugt eine sogenannte Backreference (dadurch können wir uns beim Ersetzen in $replace darauf beziehen)

    (\d.*?).(\d.*?). findet zwei Zahlen (jeweils eine Backreference) durch Punkt getrennt wobei die zweite am Ende einen Punkt haben muss.

    .(\d.*?)$ findet eine Zahl vor der ein Punkt vorkommt und die am Ende des $text steht

    in $replace können wir uns nun auf diese Backreferences beziehen. Diese werden in der Reihenfolge des Auftretens in $pattern durchnummeriert (beginnend bei 1).

    Das erfolgt durch

    $3-$2-$1

    Hier wird das zerlegte Datum in der Form yyyy-mm-tt wieder zusammengesetzt...

    ...und ist somit für strtotime(...) interpretierbar.

    Wenn du aber, wie Jaraz bereits geschrieben hast, das Datum in deinen Datensätzen gleich als Timestamp (Sekunden seit 01.01.1970) ablegst, dann ist diese Umwandlung nicht mehr notwendig und ausgeben kannst du das Datum dann via date("d.m.Y",$timestamp)

  3. Die Daten kommen aus einer Textdatei mit dem Aufbau:

    Datum;Beschreibung;Beschreibung;Datensatznr

    Hast du denn keine Möglichkeit, eine Datenbank für diese Zwecke zu nutzen ?

    Damit wärst du wesentlich schneller und hast auch viel mehr (zumindest einfachere) Möglichkeiten zur Bearbeitung der Datensätze.

    Zu dem Hinweis von Jaraz:

    Solltest du keine Datenbank nutzen können, dann nimm auf jeden Fall einen Unix-Timestamp, denn damit sparst du dir auch das Konvertieren beim Sortieren und somit auch Rechenzeit.

    @Jaraz:

    Da mittels usort() kein Interpreter-Code ausgeführt werden muss (ausser zum Vergleich), denke ich, dass diese Variante nach dem Einlesen die schnellere ist. Denn da es keine "Insert"-Funktion für Arrays in PHP gibt (zumindest noch nicht) müssten ja die Element beim "Davor"-Einfügen immer um eins nach hinten verschoben werden (wenn man nicht zwei Arrays nutzt).

    Und was auch wichtig wäre ist die Anzahl der Datensätze.

    Auf jeden Fall eine interessante Frage.

  4. aha, danke. Dein sort_by_date funktioniert.

    Aber jetzt möchte ich das ganze halt noch verstehen.

    Was ist jetzt bei meinem bubblesort falsch?

    Eigentlich nur der Vergleich:


    if($jjjj2 <= $jjjj)
    if($mm2 <= $mm)
    if($tt2 < $tt)
    {...}
    [/PHP]

    Angenommen, Datum 2 ist 10.12.2001 und Datum 1 der 10.10.2004:

    [PHP]
    if ( 2001 <= 2004 )
    //ja, also
    if (12 <= 10)
    //nein, also abbruch, obwohl Datum2 kleiner Datum1 ist!

    Dein Algorithmus ist auch sehr verschwenderisch, da die Iteration komplett durchlaufen wird, auch wenn bereits alle Werte sortiert sind.

    Das ist eine gute Frage von Jaraz...

    Holst du die Daten eventuell aus einer Datenbank ?

  5. Dein Bubblesort müsste übrigens richtiger so aussehen:


    function bubble_sort($alles)
    {
    $pattern='/(\d.*?).(\d.*?).(\d.*?)$/';
    $replace='$3-$2-$1';
    do
    {
    $ok = true;
    for ($i=0; $i < (count($alles)-1); $i++)
    {
    $ta = strtotime(preg_replace($pattern,$replace,$alles[$i][0]));
    $tb = strtotime(preg_replace($pattern,$replace,$alles[$i+1][0]));
    if ($ta>$tb)
    {
    $tmp = $alles[$i];
    $array[$i] = $alles[$i+1];
    $alles[$i+1] = $tmp;
    $ok = false;
    }
    }
    } while (!$ok);
    }
    [/PHP]

    Ich habe deine Datumzerlegung mal ersetzt.

  6. JETZT weiss ich, worauf du hinauswillst!

    Also nochmal


    function sort_by_date($a,$
    {
    $pattern='/(\d.*?).(\d.*?).(\d.*?)$/';
    $replace='$3-$2-$1';
    $ta = strtotime(preg_replace($pattern,$replace,$a[0]));
    $tb = strtotime(preg_replace($pattern,$replace,$b[0]));
    return $ta>$tb;
    }


    usort($alles,"sort_by_date");

    print_r($alles);
    [/PHP]

    Nimm deine Bubblesort-Funktion raus, integriere die "sort_by_date"-Funktion (s.o.) und sortiere dann mittels usort dein Array.

    Ich habe den Aufruf hier gleich so gemacht, dass er auf dein Beispiel passt (Datensatzarray heißt $alles und $alles[..][0] ist immer das Datum).

    Zur Funktionsweise:

    mittels usort(..) kannst du ein Array (1. Parameter) über eine benutzerdefinierte Funktion (2. Parameter, Funktionsname als String) sortieren. Hierbei werden der benutzerdefinierten Funktion zwei Parameter (zwei zu vergleichende Elemente des zu sortierenden Arrays) übergeben, mit denen du dann deinen Vergleich machen kannst.

    In deinem konkreten Fall sind diese zwei Elemente auch wiederum Arrays, so dass wir uns aus diesen das entsprechende Feld (hier Index 0) nehmen müssen, um einen Vergleich anstellen zu können.

    Ich habe hier mit RegEx nichts weiter getan, als das Datum vom Format dd.mm.yyyy in eine für strtotime(..) verständliche (englische) Notation zu bringen (yyyy-mm-dd). strtotime(..) wandelt jetzt dieses Datum in einen Unix-Timestamp (Anzahl Sekunden seit 1.1.1970) um, so dass diese sich jetzt vergleichen lassen.

    Soll das Array absteigend sortiert werden, musst du lediglich

    $ta>$tb durch $tb>$ta ersetzen.

    Ich hoffe, das hat geholfen.

  7. Mit RegEx noch etwas kürzer:


    function sortdate($a,$
    {
    $pattern='/(\d.*?).(\d.*?).(\d.*?)$/';
    $replace='$3-$2-$1';
    $ta = strtotime(preg_replace($pattern,$replace,$a));
    $tb = strtotime(preg_replace($pattern,$replace,$);
    return $ta>$tb;
    }


    $datum = array(
    "13.08.1997","16.12.1977","25.08.1979","05.05.2004"
    );

    usort($datum,"sortdate");

    print_r($datum);
    [/PHP]

  8. Da muss ich Jaraz Recht geben, das wäre auf jeden Fall die bessere Variante, da so auch gleich die Gültigkeit des Datums geprüft wird (30.02.03 ist zum Beispiel ungültig).

    Aber trotzdem der Regex dazu (für preg-Funktionen von PHP, ist also PERL-Kompatibel)

    
    /((?:0(?!0)|1|2|3)(?<!3)[0-9]|3[0-1])\.((?:0(?!0)|1)(?<!1)[0-9]|1[0-2])\.((?:[0-9]{4})|(?:[0-9]{2}))/
    
    

    Hier wird geprüft, ob die Zahl vor dem Punkt zwischen 01 und 31 liegt, die Zahl zwischen dem Punkt zwischen 01 und 12 und die Jahreszahl 2 oder 4 Stellen hat (bei drei Stellen werden nur die ersten beiden zurückgegeben).

    Für Tag, Monat und Jahr werden auch Backreferences erzeugt.

  9. Noch etwas: anstatt des festen Datums kannst du auch das aktuelle nehmen:

    
    SELECT TO_DAYS( NOW() ) - TO_DAYS( anmeldedatum ) AS angemeldete_tage, DATE_FORMAT( anmeldedatum, '%d.%m.%Y') AS angemeldet_seit FROM tabelle
    
    

    Wenn "anmeldedatum" ein Feld mit einem Datumtyp in der Tabelle "tabelle" ist, dann liefert diese Abfrage für jeden Datensatz folgende Felder zurück:

    angemeldete_tage: Anzahl Tage seit Anmeldung (bis jetzt)

    angemeldet_seit: Datum des Anmeldens im Format dd.mm.yyyy

  10. Seltsam, bei mir funktionierts einwandfrei. Aber es könnte vielleicht daran liegen, dass ich die preg-funktionen von PHP benutze und nicht ASP.


    $parr = array("/(?<!<\/a|\")>/si","/(<[^a|\/])/si");
    $rarr = array(">","<");
    $text=<<<ENDTEXT
    in einem text sollen alle
    < durch <
    und > durch >
    ersetzt werden.
    aber nur wenn die < und > nicht zu einen <a href="...">xxx</a> tag gehören.
    ENDTEXT;

    echo preg_replace($parr,$rarr,$text);
    [/PHP]

    ergibt:

    [code] in einem text sollen alle <durch < und > durch > ersetzt werden. aber nur wenn die <und > nicht zu einen <a href="...">xxx</a> tag gehören. [/code]

  11. Ich habe etwas:

    /(<[^a|\/])/si

    findet alle <, denen kein "a" oder "/" direkt folgt

    /(?<!<\/a|\")>/si

    findet alle >, vor denen direkt kein </a und kein " steht

    Das bedeutet auch, dass link-Tags immer so geschrieben werden müssen:

    <a href="..">

    </a>

    (ohne Leerzeichen oder sonstiges hinter "<" bzw. vor ">")

    und demzufolge einem >, das ersetzt werden soll, kein ",a oder A voransteht

  12. und wenn es ein <a> tag ist soll nix replaced werden...wo is die funktionalität??

    Stimmt, daran hab ich gar nicht gedacht!

    Ich überleg noch mal, poste wenn ich was habe.

    [EDIT]

    Gibt es denn irgendwelche Erkennungsmerkmal in deinem Text, ob es sich um ein Tag handelt oder nicht (zum Beispiel: bei Tags folgt direkt auf < ein Buchstabe, sonst ein Leerzeichen oder eine Zahl) ?

    [/EDIT]

  13. Erstens verbitte ich mir diese Bemerkung (<kindisch...>) - das kann man meinem Sohn sagen. Ich habe diese Ausdrucksform nur gewählt, um meinem Unmut darüber Ausdruck zu machen, dass in diesem Fall ohne es auszuprobieren behauptet wird, es würde nicht funktionieren. Aber was solls.

    @dersherriff:

    Deine Ausführung sind vollkommen korrekt, allerdings haben diese nichts mit meinem Beispiel zu tun:


    echo "<a href='mailto:$row[mail]'>$row[mail]</a>";
    [/PHP]

    Der Index des Array $row ist hier zum einem ein String und wird, da die Variable bereits innerhalb Anführungszeichen steht, auch als ein solcher interpretiert. Und das ist nicht nur Zufall, sondern eine Regel des PHP-Interpreter.

    Zu dem Fall mit der Konstante:

    Konstantennamen werden innerhalb Anführungszeichen nicht interpretiert sondern als einfache Zeichenkette angenommen:

    [PHP]
    $row['mail']='me@domain.de';
    define('mail','Fehler');
    echo "<a href='mailto:$row[mail]'>$row[mail]</a>";
    //ergibt:
    //<a href='mailto:me@domain.de'>me@domain.de</a>

    Würde der Interpreter die definierte Konstant 'mail' innerhalb des Strings finden, dann müsste wohl oder übel ein leerer Link herauskommen.

    Und bevor jetzt wieder jemand behauptet, Hochkommate als Trenner für Attributwerte innerhalb HTML-Tags würden zwar funktionieren, wären aber nicht korrekt: www.w3c.org

    Ich bitte aus diesem Grund alle (auch die diesen Thread nur lesen) sich vor dem posten zu informieren, bevor man es tut (zumindest wenn es auf diese Art und Weise geschieht).

    Ich nehme mich davon nicht aus, aber da ich hier unter Fachleuten bin, lese ich erst nach und schreibe dann.

    Noch etwas: bitte fühlt euch nicht angegriffen, der Eindruck könnte hier unter Umständen entstehen, ist aber in keinster Weise so gemeint (was in einem Gespräch im Angesicht nicht der Fall wäre)

    In diesem Sinne ein schönes Wochenende.

    ;)

  14. Genau das gleiche Problem habe ich beim Mozilla auch schon festgestellt:

    
    div
    
    {
    
     border: 1px solid #000;
    
    }
    
    div.inner1
    
    {
    
      width: 80%;
    
    }
    
    div.inner2
    
    {
    
      width: 80%;
    
    }
    
    
    <div>
    
     <div class="inner1">
    
       <div class="inner2">
    
       </div>
    
     </div>
    
    </div>
    
    

    Sollte eigentlich drei jeweils innerhalb liegende Ebenen ergeben, macht Mozilla leider nicht (im Gegensatz zum IE). Mozilla nimmt hier als Bezugsgröße zu den 80% die Breite des äußersten div statt des direkt übergeordneten.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...