Nach preg_replace funktioniert if Abfrage nicht

  • PHP

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von GCAsk.

    Nach preg_replace funktioniert if Abfrage nicht

    Guten Morgen,

    ich stehe derzeit vor einem Problem und weiß nicht, woran es liegen könnte.

    Ich lese eine Spalte aus einer MySQL-Datenbank aus und entferne zunächst jegliche Zahlen, danach aber auch Klammern und deren Inhalt in diesen.

    Je nach dem, was herauskommt, soll mir dies zuerst in der Select Liste angezeigt werden.

    PHP-Quellcode

    1. //Zum Zerlegen des Strings
    2. $getstring = $row->Spaltenname;
    3. $patterns2 = array();
    4. $patterns2[0] = '/[0-9]/';
    5. //entfernt Klammern und Inhalt
    6. $patterns2[1] = '/\s*\([^)]*\)/';
    7. $replacements2 = array();
    8. $replacements2[0] = '';
    9. $replacements2[1] = '';
    10. $value = preg_replace($patterns2, $replacements2, $getstring);


    PHP-Quellcode

    1. if ($value == ('Keine Frist')){
    2. echo "<option selected>Keine Frist</option>";
    3. echo "<option >Jahre</option>";
    4. echo "<option >Monate</option>";
    5. echo "<option >Wochen</option>";
    6. echo "<option >Tage</option>";
    7. }elseif ($value == ('Jahr')){
    8. echo "<option >Keine Frist</option>";
    9. echo "<option selected>Jahre</option>";
    10. echo "<option >Monate<option>";
    11. echo "<option >Wochen</option>";
    12. echo "<option >Tage</option>";
    13. }elseif ($value == ('Monat')){
    14. echo "<option >Keine Frist</option>";
    15. echo "<option >Jahre</option>";
    16. echo "<option selected>Monate</option>";
    17. echo "<option >Wochen</option>";
    18. echo "<option >Tage</option>";
    19. }elseif ($value == ('Woche')){
    20. echo "<option >Keine Frist</option>";
    21. echo "<option >Jahre</option>";
    22. echo "<option >Monate</option>";
    23. echo "<option selected>Wochen</option>";
    24. echo "<option >Tage</option>";
    25. }elseif ($value == ('Tag')){
    26. echo "<option >Keine Frist</option>";
    27. echo "<option >Jahre</option>";
    28. echo "<option >Monate</option>";
    29. echo "<option >Wochen</option>";
    30. echo "<option selected>Tage</option>";
    31. }


    Wo liegt der Fehler?
    Ist $value "Keine Frist", so funktioniert es, bei dem Rest allerdings nicht, da bleibt die Selection komplett leer ohne Inhalt.
    Das Zerlegen funktioniert richtig. Lass ich mir per echo die Variable ausgeben, ist sie richtig.

    Danke im Voraus!
    Hast du eventuell whitespaces vor/nach dem Wert aus der DB? Groß- und Kleinschreibung korrekt? Gib den Inhalt mal mit var_dump($value); aus, damit solltest du das besser sehen können.
    Und verlasse dich am besten nicht, wie es im Browser angezeigt wird, sondern schau dir den Quelltext z.B. in der Developer-Konsole in deinem Browser an.
    Prüfe außerdem mal, ob du einen Doctype in deinem HTML hast, da XHTML keine attribute minimization erlaubt.

    Hier noch ein paar Verbesserungsvorschläge für deinen Code:
    - lass die Klammern um die Strings im If weg (also wenn if($value == 'Keine Frist'))
    - bin mir nicht ganz sicher, aber ein RegEx könnte auch reichen: /\d+|\s*\([^)]*\)/
    - den PHP-Code kannst du wie folgt etwas übersichtlicher und wartbarer gestalten:

    PHP-Quellcode

    1. $options = array(
    2. 'Keine Frist' => 'Keine Frist',
    3. 'Jahr' => 'Jahre',
    4. 'Monat' => 'Monate',
    5. 'Woche' => 'Wochen',
    6. 'Tag' => 'Tage'
    7. );
    8. foreach($options as $key => $text) {
    9. echo "<option", ($key === $dbValue ? " selected" : ""), ">", htmlspecialchars($text), "</option>";
    10. }

    - dein Datenbank-Design ist hier etwas "ungünstig". Statt die Strings abzuspeichern, solltest du lieber einen enum oder "richtige" Konstanten verwenden. Sonst hast du irgendwen falsche Werte in der DB und der Versuch, die mit preg_replace zu reparieren endet dann in so etwas hier.
    Hi,

    also erstmal hast du unnötigen Code. Die Nummerierung kannst du dir sparen, denn:

    PHP-Quellcode

    1. <?php
    2. $arr = array();
    3. $arr[] = "erster wert";
    4. $arr[] = "zweiter wert";
    5. ?>

    das wird automatisch richtig nummeriert. $arr[0] enthält als Wert also den String "erster Wert". Noch einfacher wäre:

    PHP-Quellcode

    1. <?php
    2. $arr = array("erster Wert", "zweiter Wert");
    3. ?>


    Zudem kannst du dir das replacements-Array sparen, weil die einfache Übergabe einer leeren Zeichenkette ("") auf's gleiche rausgeht. Und das zusätzliche Klammernpaar bei den if-Abfragen brauchst du auch nicht.

    Wieso du 2 Pattern brauchst weiß ich aber auch nicht. Schreib doch einfach so:

    PHP-Quellcode

    1. <?php
    2. $value = preg_replace('/[0-9]|\(.*?\)/', '', $getstring);
    3. ?>


    7 Codezeilen zusammengefasst in eine. Mach vor den if-Abfragen mal eine Ausgabe von $value. Was steht dort? Ggf. mit htmlspecialchars arbeiten, man weiß ja nie. Und füge den if-Abfragen eine weitere Abfrage hinzu, und zwar als letztes folgendes:

    PHP-Quellcode

    1. else{
    2. echo $value . " passt auf keine der oberen Abfragen<br />".
    3. }


    Ggf. trim noch nehmen um Leerzeichen zu cutten wenn du dir ned sicher bist.

    Link :thumbup:
    Hello World
    Vielen Dank. @Link, deine Verbesserungsvorschläge habe ich umgesetzt, danke.

    @3daycliff Auch deinen Tipp habe ich umgesetzt und meinen Code durch deinen ersetzt.

    Unabhängig davon, was mir $value zurückgibt, steht jetzt aber immer nur Keine Frist in der Select Box.
    Liegt vielleicht hieran? htmlspecialchars($text) ?
    $text nimmt sich die Werte vom Array oder?

    /EDIT:
    var_dump ergibt folgendes:
    string(3) "12 " string(6) " Monat"
    Aus deinem var_dump erkennst du: Vor Monat ist ein Leerzeichen ;) Das könntest du z.B. mit

    PHP-Quellcode

    1. $value = trim($value);

    verhindern. Wie @Link ja schon erwähnt hat. Dann sollte auch deine If-Abfrage funktionieren.
    Hi,

    du hast im Array hinter "12" ein Leerzeichen und vor "Monat" auch eins. Deswegen das trim(); das du nutzen solltest. Der schneidet Leerzeichen vorn und hinten ab. Theoretisch kannst du dies auch direkt in dein RegEx-Pattern mit aufnehmen, dann sparst du dir ne Zeile. Somit also Pattern: [0-9]|\(.*?\)|^\s*|\s*$ und Ersetzung mit leerer Zeichenkette eben ("").

    Den Code von @3daycliff erklär ich mal eben:
    - Ein Array "$options" wird erstellt und mit Werten gefüllt.
    - Beispiel: echo $options['Keine Frist']; Würde "Keine Frist" ausgeben
    - Array $options wird in einer Schleife durchlaufen, wobei bei jedem Schleifendurchgang 1 Eintrag aus dem Array abgerufen wird. Variable $key enthält den Schlüssel des Eintrags. Variable $text enthält den Wert des Eintrags

    Welches Array gibst du denn mit var_dump() aus? Das steht nicht dabei.
    //Edit: achja, $value vermutlich. Ok passt. Dann wie gesagt die Sache mit trim() versuchen bzw. direkt im Pattern so einbauen wie beschrieben.


    Link :thumbup:
    Hello World
    Ja super, freut mich :)

    Also verzichte auf die If-Konstrukte die du hast. Nimm die Schleife von @3daycliff und füge das " selected" dynamisch hinzu.
    Immer so programmieren, dass man Änderungen an nur einer Stelle vornehmen muss. Redundanz und dezentrale Strukturierung deines Codes wirst du früher oder später mal ganz heftig büßen müssen.

    Link :thumbup:
    Hello World

    Link schrieb:

    Redundanz und dezentrale Strukturierung deines Codes wirst du früher oder später mal ganz heftig büßen müssen.

    Und spätestens dann wirst du es lernen müssen und wollen ;)