Anfänger-Frage zu verschachtelter if-Anweisung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Anfänger-Frage zu verschachtelter if-Anweisung

    Hallo!

    Hab eine kleine Frage zu folgendem (halb fehlerhaften) Code:

    PHP-Code:
      $url blabla

      
    $var=get_remote_file($url);

      
    $regexeins 'xy';

      
    preg_match($regexeins,$var,$matcheins);

      
    $regexzwei'xyz';

      
    preg_match($regexzwei,$var,$matchzwei);

      if(
    count($matcheins) >= 1){

      
    $result$matcheins[1];

      }elseif(
    count($matchzwei) >= 1){

      
    $result$matchzwei[1];

      }else{

      
    $result"none";

      } 
    Ich möchte gerne $regexzwei nur ausführen lassen, wenn $matcheins= 0, d.h.:

    1. $regexeins
    2. falls matcheins = 0 --> $regexzwei; ansonsten: $result= $matcheins[1]
    3. falls matchzwei auch = 0 --> $result= "none"; ansonsten $result= $matchzwei[1]

    Bin leider zu ungeübt, um diese Logik ohne großes Kopfzerbrechen in PHP-Code umzusetzen. Wär nett, wenn mir jemand helfen könnte - danke!
    Zuletzt geändert von baerenwurm; 28.12.2008, 17:52.

  • #2
    Mit einer Funktion zum Beispiel:

    PHP-Code:
    function get_matches($var) {
        
    $regexeins 'xy';
        
    preg_match($regexeins,$var,$matcheins);
        
        if(
    count($matcheins) >= 1){
            return 
    $matcheins[1];
        }

        
    $regexzwei'xyz';
        
    preg_match($regexzwei,$var,$matchzwei);
        
        if(
    count($matchzwei) >= 1){
            return 
    $matchzwei[1];
        }

        return 
    'none';
    }

    $url blabla;

    $var get_remote_file($url);

    $result get_matches($var); 

    Kommentar


    • #3
      Hm, wozu in eine Funktion auslagern? Aber wenn schon, dann zu etwas in dieser Richtung abstrahieren:
      PHP-Code:
      function get_matches($var$regex1$regex2)
      {
          if (
      preg_match('/' preg_quote($regex1'/') . '/'$var$matches) != 0)
          {
              return 
      $matches[1];
          }

          if (
      preg_match('/' preg_quote($regex2'/') . '/'$var$matches) != 0)
          {
              return 
      $matches[1];
          }

          return 
      null;

      So ist die Funktion insofern flexibler, dass sie nicht nur für zwei konkrete reguläre Ausdrücke funktional ist.

      Darüber hinaus gehören zu einem validen Regulären Ausdruck Begrenzer (siehe Backslash).

      Grüße
      Nieder mit der Camel Case-Konvention

      Kommentar


      • #4
        Vielen Dank - ihr habt mir sehr geholfen.

        (Wo würde denn bei der zweiten Funktion 'xy' bzw. 'xyz' hinkommen?)

        Kommentar


        • #5
          Falls mit xy und xyz konkrete Reguläre Ausdrücke gemeint sind, so sind sie als zweiter bzw. dritter Parameter der Funktion get_matches zu übergeben (siehe die Namen der Funktionsparameter). Es sei aber darauf hingewiesen, dass das so Quatsch ist. xyund xyz sind konkrete Zeichenketten und keine Muster, ergo brauchst du für die Suche nach ersteren keine Regulären Ausdrücke und preg-Funktionen, sondern ein einfaches strpos.
          Nieder mit der Camel Case-Konvention

          Kommentar


          • #6
            Nochmals danke. Was den Sinn und Unsinn von Regulären Ausdrücken und preg-Funktionen betrifft: "xy(z)" steht für
            PHP-Code:
            /\<xml\>(?:.*)<xml2\>(.*)<\/xml2\>(?:.*)<\/xml\>/ 
            , d.h. ich brauch die hier wohl tatsächlich...

            Kommentar


            • #7
              Ja, in dem Falle hast du natürlich Recht (wenngleich - nur der Vollständigkeit halber - Reguläre Ausdrücke nicht der einzige Lösungsweg sind).

              Wenn du Lust hast, kannst du dir ja mal überlegen, ob du deinen Regulären Ausdruck nicht optimieren könntest. Drei Greedy Dots (.*) in einem Ausdruck können unter Umständen signifikant an der Performance des Ausdrucks knabbern. Siehe dazu Atomic Grouping.


              Grüße
              Nieder mit der Camel Case-Konvention

              Kommentar

              Lädt...
              X