Undefinet Offset

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

  • Undefinet Offset

    Hallo Zusammen,
    Habe ein ein Problem, und weiss nicht mehr weiter.

    Ich bin möchte 2 verschiedene texte aus einer datei lesen, die sind so aufgeteilt:
    {short}text1{/short} {text}textext{/text}

    Nun habe ich dafür eine extra Funktion:
    PHP-Code:
    function pzh($tag$source)
    {
        
    preg_match_all('!\{'.$tag.'\}(.*)\{/'.$tag.'\}!isU'$source$while);
            
    //print_r($while);
            
    return $while[1][0];

    Das regex hab nicht ich geschrieben, ich glaube aber daran liegt es nicht

    Und das Ganze wende ich nun Folgt an:
    PHP-Code:
        $fp fopen('../content/news/n'.$row_new['id'].'.new''r');
        
    $news fgets($fpfilesize('../content/news/n'.$row_new['id'].'.new')+1);
        
    fclose($fp);
        
    $short pzh('short'$news);
        
    $text pzh('text'$news); 
    Augabe:
    Der text zwischen {short}und{/short} erscheint, der andere nicht. Zudem wird dieser fehler ausgegeben: Notice: Undefined offset: 0 in /srv/www/vhosts/andys-tools.ch/httpdocs/cms/admin/functions.php on line 42

    Linie 42 ist die linie in der Funktion (return $while[1][0]


    Nun kommt das komische, wenn ich das in einem Simplen test Code auprobiere funktioniert es einwandfrei:
    PHP-Code:
    function pzh($tag$source)
    {
        
    preg_match_all('!\{'.$tag.'\}(.*)\{/'.$tag.'\}!isU'$source$while);
            
    //print_r($while);
            
    return $while[1][0];
    }

    $b '{short}cxx{/short} basf {text}tttt{/text}';
    echo 
    pzh('short'$b);
    echo 
    pzh('text'$b); 

    Ich hoffe ihr versteht mein problem und könnt mir helfen,
    mfg, andy
    Bücher für Programmierer

  • #2
    Die Regex würde ich um ein *? (lazy star) erweitern:
    Code:
    '!{'.$tag.'}(.*?){/'.$tag.'}!is
    Zu dem Offset-Problem: Den bekommst du jedes Mal, wenn du auf ein Array-Element zugreifst, das nicht existiert. Es ist also nicht ratsam, deine Funktion $while (das die Treffer der Regex enthält [möglicherweise besser $matches oder $captures oder ähnliches nennen]) ohne Weiteres zurückgeben zu lassen, sondern vorher zu kontrollieren, dass es den gewünschten Wert auch gibt.

    Z.B.:
    PHP-Code:
    return (isset($matches[1][0]) ? $matches[1][0] : null); 
    Aus irgendeinem Grund scheint also der reguläre Ausdruck nicht zu greifen -> Testausgaben machen

    Grüße
    Nieder mit der Camel Case-Konvention

    Kommentar


    • #3
      du hast doch schon ein print_r($while) da stehen, nimm mal die // da weg und schau was rauskommt. kannst das ergebnis auch posten

      Kommentar


      • #4
        Weil das Element nicht existiert, gibts eine Notice. Wahrscheinlich matcht dein Ausdruck einfach nicht. Lass dir doch mal den Text ausgeben, der in die Funktion gereicht wird.
        [FONT="Helvetica"]twitter.com/unset[/FONT]

        Shitstorm Podcast – Wöchentliches Auskotzen

        Kommentar


        • #5
          Danke erstmal für die schnellen Antworten.

          @Griecherus, das mit der überprüfung ob das Array Element existiert hab ich bereits gemacht, jedoch kann ich damit nur die Fehlermeldung 'verhindern'.

          Testausgaben hab ich allgemein heute schon X gemacht, hier, wen ich print_r auskommentiere:
          Code:
          Array ( [0] => Array ( [0] => {short}DAs sind die kleinen, kurzen news{/short} ) [1] => Array ( [0] => DAs sind die kleinen, kurzen news ) ) Array ( [0] => Array ( ) [1] => Array ( ) )
          Sry wegen der darstellung, ist irgendiwe einfach so im Broser.

          irgendwie wird die Funktion das 2. Mal gar nicht ausgeführt, bei der testausgabe sieht das ganze so aus:

          Code:
          Array
          (
              [0] => Array
                  (
                      [0] => {short}cxx{/short}
                  )
          
              [1] => Array
                  (
                      [0] => cxx
                  )
          
          )
          Array
          (
              [0] => Array
                  (
                      [0] => {text}tttt{/text}
                  )
          
              [1] => Array
                  (
                      [0] => tttt
                  )
          
          )


          Edit:
          In der datei steht:
          Code:
          {short}DAs sind die kleinen, kurzen news{/short}
          	{text}und das die grossen{/text}
          Zuletzt geändert von andygyr; 01.05.2008, 16:38.
          Bücher für Programmierer

          Kommentar


          • #6
            Hallo,

            einmal bitte den Code umbrechen..

            Zum Problem: hab zwar keine Lösung, aber mal versucht, dass ganze $while (unglücklicher name eigentlich) zurückzugeben? und dann außerhalb der Function mal auszugeben?

            mfg

            Kommentar


            • #7
              Hab das Problem jetzt gelöst.
              Irgendwie war es der fehler das zwischen dem {short} und {text} ein 'komischer' abstand war, also in der datei zeigte es einfach so vierecken an, hab die jetzt susammen gemacht und das ganze teil funktioniert.

              Vielen dank für eure bemühungen,
              mfg andy
              Bücher für Programmierer

              Kommentar

              Lädt...
              X