Frage zu regex-Ausdruck

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

  • Frage zu regex-Ausdruck

    Hallo zusammen,

    habe folgenden String:

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit

    Liste:test 1:1

    Maecenas tincidunt fermentum purus. Aliquam erat volutpat. Mauris orci pede, ornare a, tincidunt et, ultrices sodales, nibh.

    Liste:test asdasd:45

    bibendum non, sapien. In sem.

    Mittels preg_match_all möchte ich ein Array erzeugen, dass folgendermaßen aussieht:

    PHP-Code:
    Array([0] => '
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit'
    ,

    [
    1] => 'Liste:test 1:1',

    [
    2] = >'Maecenas tincidunt fermentum purus. Aliquam erat
    volutpat. Mauris orci pede, ornare a, tincidunt et, ultrices sodales, nibh.'
    ,

    [
    3] => 'Liste:test asdasd:45',

    [
    4] => 'bibendum non, sapien. In sem.'

    Dafür hatte ich jetzt mal sowas in der Richtung:

    PHP-Code:
    preg_match_all("/(.*)(Liste:.{1,}:[0-9]{1,})(.*)/is",$Originaltext$arr_Inhalte); 
    Nur leider wird dann der erste Listeneintrag verschluckt und steht mitten im Text...

    Wie muss denn der korrekte Regex aussehen?

    DANKE!

  • #2
    du willst doch bloß den string nach doppeltem zeilenumbruch (etwa "\n\n") exploden.

    Kommentar


    • #3
      hab noch überlegt ob ich sage, dass nen doppelter Zeilenumbruch nicht zwingend da stehen muss Das war für die Übersichtlichkeit... da könnten auch keiner 1 oder 3 stehen

      Kommentar


      • #4
        was ist das das kriterium der regelmäßigkeit?

        Kommentar


        • #5
          Es steht immer dort

          ListeBeliebige Zeichen mit Sonder- und Leerzeichen)Zahlen von 1-9999)

          Davor und dahinter Fließtext mit allen seinen Facetten

          Kommentar


          • #6
            Hab das jetzt so gelöst: Zuerst alle Listen raussuchen und in ein Array speichern, dann alle Listeneinträge durch ein Trennzeichen ersertzen und mit diesem den restlichen Inhalt exploden, dann Arrays zusammenführen:

            PHP-Code:
            $arr_Inhalte = array();      
            preg_match_all("/Liste:[a-zA-Z ]*:\d{1,4}/is",$Originaltext$arr_Inhalte);

            $arr_Listen = array();
                      
            foreach(
            $arr_Inhalte as $Inhalt) {
               foreach(
            $Inhalt as $Liste) {
                  
            $Originaltext str_replace($Liste,"####",$Originaltext);
                  
            array_push($arr_Listen$Liste);
               }
            }
                       
            $arr_Inhalte explode("####",$Originaltext);
            $arr_Final = array();
            $ListenCounter 0;
                       
            foreach(
            $arr_Inhalte as $Inhalt) {
                          
               if(
            $Inhalt != "")
                  
            array_push($arr_Final$Inhalt);
                          
               if(!empty(
            $arr_Listen[$ListenCounter]))
                  
            array_push($arr_Final$arr_Listen[$ListenCounter]);
                          
               
            $ListenCounter++;

            Ist an der Idee irgendwas nicht gut?

            Kommentar


            • #7
              Nur leider wird dann der erste Listeneintrag verschluckt und steht mitten im Text...
              Wenn du dir die Funktionsweise von RegExp mal vor Augen führst dann wirst du sehen, dass deine REgExp wie gewünscht funzt.
              Durch .* gibst du dem RegExp an ALLES zu schnappen und dein String Liste... wird eben durch .* abgedeckt, also kommt der zweite Teil gar nicht zum Zuge.
              Wenn immer du mit .* arbeitest und danach explizit nach einer bestimmten Zeichenkette suchen willst, solltest du den RegExp auf ungreedy setzen. Dann wird bei jedem Treffer gepüft ob der Treffer ev durch das folgende Muster abgedeckt wird und wenn ja, dann wird dieses verwendet.
              Der Modifikator den du brauchst ist U
              Also probier das
              PHP-Code:
              preg_match_all("/(.*)(Liste:.{1,}:[0-9]{1,})(.*)/isU",$Originaltext$arr_Inhalte); 
              Funzt es nun besser ?

              Gruss

              tobi
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar

              Lädt...
              X