[REGEX] Habe probleme mit suchmuster

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

  • [REGEX] Habe probleme mit suchmuster

    Hallo ertsmal.

    Ich hoffe ihr könnt mir helfen :-d

    und zwar habe ich ein prob mit script.
    Ich möchte eine css datei einlesen die ich mit tags gefüllt habe
    bsp.:
    [body]
    [color:#ffffff]
    .....
    [/body]
    So die lese ich ein und will die mit preg_match durchsuchen.
    Als erstes suche ich nach den class tags dann nach denuntergeordneten.
    und bei den unteren habe ich prob das ich nicht alles rausfischen kann.
    Ich poste mal mein sript.
    PHP-Code:
    $arr_result =array();
    $o_f =@fopen("./name.txt""r");
    $size =filesize("./name.txt");
    $name =fread($o_f$size);
    @
    fclose($o_f);
    $arr_name =explode(":"$name);
    $name_count =count($arr_name)-1;
    $result =implode(""file("./test.css"));
    for(
    $i =0$i <=$name_count$i++):
     
    preg_match("/(\[$arr_name[$i]])(.*)(\[\/$arr_name[$i]\])/sm"$result$matches);
     
    $arr_tags[$arr_name[$i]] =$matches[2];
    endfor;
    echo
    "".$arr_tags["body"]."<br>"
    $tags_count =count($arr_tags)-1;
    for(
    $i =0$i <=$tags_count$i++):
     
    #echo"".$arr_tags[$arr_name[$i]]."<br>";
     
    preg_match("/(\[(.*):(.*)\])/"$arr_tags[$arr_name[$i]], $tags_result);
     
    $re =$tags_result;
    endfor;
     
    #echo$re;
    foreach($re as $k =>$v):
     echo
    $k ."=>".$v."<br>"
    endforeach; 
    Hmm der zweite preg_match wird nicht richtig dargestellt.
    Vieleicht geht es so:
    preg_match("/(\[(.*) : (.*)\])/", $arr_tags[$arr_name[$i]], $tags_result);
    leerzeichen einfach weg denken.
    vieleicht findet ihr da eine lösung bei den zweiten preg_match suchmuster.

    Danke schon mal im voraus
    Zuletzt geändert von srtune; 25.10.2003, 20:34.

  • #2
    [list=1][*]Im ersten preg fehlen auch ein paar Backslashes ... hat das Forum verschluckt.
    preg_match("/(\[$arr_name[$i]\])(.*)(\[\/$arr_name[$i]\])/sm", $result, $matches);[*]Warum arbeitest du nicht einfach mit back references? Dann kannst du dir $arr_name sparen.
    statt:
    for($i =0; $i <=$name_count; $i++):
    preg_match("/(\[$arr_name[$i]\])(.*)(\[\/$arr_name[$i]\])/sm", $result, $matches);
    { $arr_tags[$arr_name[$i]] =$matches[2]; }

    dies:
    preg_match_all('/\[([a-z0-9_]+)(.*)\[(\1)\]/smU', $result, $matches, PREG_SET_ORDER);
    foreach($matches as $ar_match)
    { $arr_tags[$ar_match[1]] = $ar_match[2]; }[*]Bei den untergeordneten sehen die matches so aus:
    foreach($re as $x)
    { echo "$x[2] => $x[3]<br>"; }
    Wenn du das äußere Klammernpaar noch entfernst, sind´s $x[1] und $x[2].[*]Ich wär allerdings dafür, einfach die Schleife umzubauen:
    foreach($matches as $match)
    {
    $tagname = $match[1];
    echo "<b>$tagname:</b><br>";
    preg_match_all('/\[([a-z0-9])+\.*)\]/sm', $match[2], $submatches, PREG_SET_ORDER);
    foreach($submatches as $submatch)
    { echo "&nbsp;&nbsp;$submatch[1] =&gt; $submatch[2]<br>"; }
    }[/list=1]
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      Ok danke schonmal.
      Ich sehe das ich noch viel über reguläre ausdrücke lernen muss .
      Ich werte mir mal den code anschauen bzw versuc´he ihn mal zu verstehen.
      mit den back reference hatte ich bei den zweiten preg_match schon probiert ging da aber auch net.
      Danke nochmal

      Kommentar


      • #4
        hmm irgend wie funktioniert das net so wie ich will.
        Es soll ja erst die "class tags" finden und was darin steht will ich ja haben
        damit ich beim zweiten preg_match die eigenschaften auslesen kann aber
        das macht es ja net es findet jetzt alle die in den [] klammern eingeschlossen sind.
        Da war das eigentlich gar nich so falsch das ich eine class tags liste habe damit er genau das findet was in den class tags steht.
        Weiss da jemand wie ich das da dann bei den zweiten lösen kann.
        weil da gibt er mir immer nur ein wert zurück bzw eigenschaft obwhole mehrer drin stehen.
        Zuletzt geändert von srtune; 26.10.2003, 10:05.

        Kommentar


        • #5
          Hi,
          habe jetzt doch noch eine lösung gefunden.
          Ich poste mal den code, aber irgend wie finde ich den code net gut
          vieleicht hat ja jemand ein verbesserungs vorschlag.
          (habe den code erstmal profesorisch geschrieben)
          PHP-Code:
          $taglist_file  ="";
          $taglist_count =0;
          $open          =null;
          $tmp           =null;
          $tmp_size      =0;
          $tmp_count     =0;
          $arr_taglist   ="";
          $css_file      ="";
          $methodlist    ="";
          ###########################
          $taglist_file ="./name.txt";
          $css_file     ="./test.css";
          $open =@fopen($taglist_file"r");
          $tmp_size =filesize($taglist_file);
          $tmp =@fread($open$tmp_size);
          @
          fclose($open);
          $arr_taglist =explode(":"$tmp);
          /*foreach($arr_taglist as $key =>$value):
           echo$key." =>".$value."<br>";
          endforeach;*/
          $methodlist =str_replace("\n""",trim(implode(""file($css_file))));
          #echo$methodlist;
          $taglist_count =count($arr_taglist)-1;
          #echo$taglist_count;
          for($i =0$i <=$taglist_count$i++):
           
          $pattern ="(\[$arr_taglist[$i]\])(.*)(\[\/$arr_taglist[$i]\])";
           
          preg_match("/$pattern/s"$methodlist$matches);
           
          $t[$arr_taglist[$i]] =str_replace("]""]|"$matches[2]);
           
          $t1[$arr_taglist[$i]] =explode("|"$t[$arr_taglist[$i]]);
           
          $count =count($t1[$arr_taglist[$i]])-2;
           for(
          $j =0$j <=$count$j++):
            
          preg_match("/(\[(.*)):((.*)\])/s"$t1[$arr_taglist[$i]][$j], $match);

            echo
          $arr_taglist[$i]."=>".$match[2]."=>".$match[4]."<br>";
           endfor;
           
          #echo$count;
          endfor;
          /*foreach($t as $key =>$value):
           echo"---------".$key." =>".$value."----------<br>";
          endforeach;
          foreach($t1 as $k =>$v):
           echo$k."=>";
           foreach($v as $k1 ):
            echo$k1."<br>";
           endforeach;
          endforeach;*/ 

          Kommentar

          Lädt...
          X