kostenloser Webspace werbefrei: lima-city


Mein Freund REGEX

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    strange

    Kostenloser Webspace von strange

    strange hat kostenlosen Webspace.

    Sorry für den Titel, mir raucht im Moment einfach der Schädel und mir ist nicht wirklich was passendes eingefallen. Wer also einen passenderen Titel hat, immer her damit :D


    So nun aber zu meinem eigentlichen Problem. Für ein Projekt habe ich eine Funktion gebastelt die ein Array auf einen bestimmten String hin prüft, um festzustellen ob der String den richtigen wert hat und entsprechend weiter gemacht werden kann mit dem Wert.

    PHP:
    function valid_action($v) {
        include('pfad/zu/validavtions.php');
    return in_array($v, $a, true);
    }


    So wie der Code oben steht, funktioniert das alles ganz wunderbar, aber für das Projekt an dem ich arbeite reicht das nicht wirklich, da auch externe Module hinzugefügt werden können und diese ebenfalls valid_action() benutzen können, um zu prüfen ob der gewünschte Wert übergeben wird.

    Das ganze dient dazu um einen Form-Validator zu füttern. Als Beispiel zeige ich hier mal das Login-Form:

    HTML:
    <form method="post">
    <input type="text" name="user" />
    <input type="password" name="pass" />
    <input type="hidden" name="action" value="login" />
    <input type="submit" value="Send" />
    </form>


    Über $_POST['action'] wird der entsprechende Teil des Validators aufgerufen und das Form weiter verarbeitet. Nun will ich für die Module die ganze Geschichte öffnen, in dem die Module als $_POST['action'] "custom_[mod_name]" verwenden können damit eine bestimmte Datei nachgeladen wird, in der sich das Array mit den validen Actions befindet und einem Verweis auf den Teil des Moduls wo die Formulare verarbeitet werden.

    Sprich "custom_example" wird zu include('pfad/zu/example/actions.php'); (nur ein Beispiel).


    So wie ich mir das Vorstelle, sollte als erstes geprüft werden ob in dem String $_POST['actions'] "custom_" am Anfang steht und wenn dies der Fall ist, wird der Rest als pfad/zu/[REST]/actions.php verwendet.


    Da ich aber eine Niete in REGEX bin und es mal grad hin bekomme preg_replace() für billigen BBCode zu verwenden, bin ich auf Eure Hilfe angewiesen und hoffe das hier für eine elegante Lösung gefunden werden kann.


    Gruß strange
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Mh...

    $suchen="`^(custom_)(.?*)`i";
    $ersetzen='bla/blubb/der/die/das/$1/blubb';
    preg_replace($suchen,$ersetzen,$deinText);



    Frag mich bitte nicht, ob das klappt. Es ist ein wenig aus der Erinnerung geschrieben... und es ist ewig her, seit ich mit Regex gearbeitet habe. :D



    Edit:
    Ah...Spacke,da haste es mir mal wieder gezeigt.
    Das hatte ich nicht bedacht, dass * ja auch für kein Zeichen stehen kann. ^^"

    Allerdings bi ich überrascht, dass es sozusagen "fast" richtig ist, was ich da fabriziert habe.. wie gesagt: Long time has passed since i last... :P

    Beitrag zuletzt geändert: 14.5.2011 13:09:40 von adrians
  4. Autor dieses Themas

    strange

    Kostenloser Webspace von strange

    strange hat kostenlosen Webspace.

    Das suchen und ersetzen ist nicht wirklich das Problem, das kann ich im Schlaf. Es geht eher darum zu identifizieren ob "custom_" im String enthalten ist und am Anfang des Strings steht.
  5. $actions = $_POST['actions'];
    $rest    = '';
    $laenge  = strlen($actions) 
    if($laenge > 7) {
      if(strcmp(substr($actions, 0, 7), 'custom_') == 0) {
        $rest = substr($actions, 8, $laenge);
      }
    }


    Ich gebe keine Gewähr für den Code, da ich schon ewig nichts mehr mit PHP am Hut hatte (und zu faul war den jetzt zu testen), aber so geht es auch ohne RegEx.

    Der RexEx von adrians ist übrigens fast korrekt, deswegen weiß ich gar nicht, warum dir das nicht geholfen hat.
    Deswegen habe ich mal hier ein komplettes Beispiel gemacht, falls es dir wirklich nur darum geht, festzustellen, ob "custom_" am Anfang des Strings steht:

    <?php
    function check_string($src) {
      if (preg_match('/^(custom_)(.+?)/i', $src)) {
        return true;
      }
      else {
        return false;
      }
    }
    
    $string1 = "custom_keks";
    $string2 = "kekscustom_keks";
    $string3 = "custom_";
    
    printf('String 1: %s<br />', check_string($string1) ? 'Jo!' : 'Nö!');
    printf('String 2: %s<br />', check_string($string2) ? 'Jo!' : 'Nö!');
    printf('String 3: %s<br />', check_string($string3) ? 'Jo!' : 'Nö!');
    
    ?>

    Das Ergebnis kann man hier sehen: http://i-spacke.lima-city.de/regex_strange.php
    Im RegEx ist deswegen ein "+" und kein "*", da ein Stern beliebig viele (also auch keins) bedeutet und das Plus bedeutet, dass mindestens ein Zeichen folgen musst. So kannst du abfangen, dass nur "custom_" drin steht. (Man beachte, dass das oben bei dem Beispiel durch "if($laenge > 7)" sichergestellt ist)

    Schau dir einfach nochmal preg_match an:
    http://de2.php.net/manual/de/function.preg-match.php

    LG Spacke
  6. Autor dieses Themas

    strange

    Kostenloser Webspace von strange

    strange hat kostenlosen Webspace.

    Danke, das hat mir sehr geholfen, es ging mir hauptsächlich darum zu identifizieren ob "custom_" am Anfang des Strings steht und nicht die eigentlichen Werte. Wie gesagt ich bin eine Niete wenn es um REGEX Pattern geht. Bestimmte Zeichen in einem String zu finden, ist im Prinzip nicht das Problem für mich, nur das feststellen der Position im String habe ich halt nicht wirklich drauf.

    Trotzdem vielen Dank ;)
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!