kostenloser Webspace werbefrei: lima-city


letzer Satz / text von hinten seit letzem Punkt

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    freecontent

    freecontent hat kostenlosen Webspace.

    Hallo

    Wie bekomme ich aus einem Text am besten an den letzen Satz?

    $mystring = "Ich bin so blau. Ich bin so rot. Ich bin der Wassermann im Boot.";

    ... ?

    $ergebnis = "Ich bin der Wassermann im Boot.";

    evtl so (idee)

    $stringarray = explode(".",$mystring); 
    $last = (count($stringarray) -1); 
    $ergebnis = $stringarray[$last];


    oder gibts "schönere" Lösungen als Vorschlag?
    Danke!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. ole-reglitzki

    Kostenloser Webspace von ole-reglitzki

    ole-reglitzki hat kostenlosen Webspace.

    Ungetestet:
    preg_match('/(?:[\.!?]\s)?([^\.!?]*[\.!?])$/', $mystring, $treffer);  // Es werden ". ", "! " und "? " als Satztrennzeichen geduldet
    $ergebnis = $treffer[0];


    lg Ole
  4. Autor dieses Themas

    freecontent

    freecontent hat kostenlosen Webspace.

    hmm,
    wäre zwar natürlich viel besser, auch ! ? etc. als Satzzeichen zu erkennen
    aber mit dem Beispiel klappt es leider nicht

    Script-Aufgabe:

    Einen langen String (Text) zur Ausgabe in mehrere Absätze zerlegen,
    Umbruch <p> nur am Satz-Ende

    dazu wird der lange Text in mehrere Texte mit je maximal n Zeichen ge-splittet
    und dann der Teil am Ende jeses Blocks, der kein ganzer Satz mehr ist abgeschnitten
    Der folgende Block soll dann mit dem abgeschnittenen Satz beginnen,
    logisch aber garnicht so einfach

    Beispiel test1.php (mit meinem Kostrukt siehe oben) funktioniert (aber nur mit . als Satzzeichen)
    (bis auf den letzen Absatz, da stimmt was nicht)

    Beispiel test2.php mit dem preg_match von @ole-reglitzki klappt nicht, irgendwas mach ich da falsch
    der Umbruch erfolgt auch mitten im Satz

    Hier die kompletten Codes der beispiele:

    -----------------------
    TEST 1
    -----------------------
    Ausgabe test1.php hier: http://freecontent.lima-city.de/test1.php

    test1.php

    <?php
    
    $mystring = "One for all and all for one, Muskehounds are always ready. One for all and all for one, helping everybody. One for all and all for one, it's a pretty story. Sharing everything with fun, that's the way to be. One for all and all for one, Muskehounds are always ready. One for all and all for one, helping everybody. One for all and all for one, can sound pretty corny. If you've got a problem chum, think how it could be. There's a voice that keeps on calling me. Down the road, that's where I'll always be. Every stop I make, I make a new friend. Can't stay for long, just turn around and I'm gone again. Maybe tomorrow, I'll want to settle down, Until tomorrow, I'll just keep moving on. Hey there where ya goin', not exactly knowin', who says you have to call just one place home. He's goin' everywhere, B.J. McKay and his best friend Bear. He just keeps on movin', ladies keep improvin', every day is better than the last. New dreams and better scenes, and best of all I don't pay property tax. Rollin' down to Dallas, who's providin' my palace, off to New Orleans or who knows where. Places new and ladies, too, I'm B.J. McKay and this is my best friend Bear. I never spend much time in school but I taught ladies plenty. It's true I hire my body out for pay, hey hey. I've gotten burned over Cheryl Tiegs, blown up for Raquel Welch. But when I end up in the hay it's only hay, hey hey. I might jump an open drawbridge, or Tarzan from a vine. 'Cause I'm the unknown stuntman that makes Eastwood look so fine. Ulysses, Ulysses - Soaring through all the galaxies. In search of Earth, flying in to the night. Ulysses, Ulysses - Fighting evil and tyranny, with all his power, and with all of his might. Ulysses - no-one else can do the things you do. Ulysses - like a bolt of thunder from the blue. Ulysses - always fighting all the evil forces bringing peace and justice to all.";
    
    
    $maxzeichen1 = 300;   // ------ max. Text-Block Zeichen ------- 
    
    $neuertext = wordwrap( $mystring, $maxzeichen1, "{#}" );
    
    $descarray = explode("{#}", $neuertext); 
    
    
    echo "<br />\r\n"; 
    echo "<br />\r\n"; 
    echo "<br />".$mystring."\r\n"; 
    echo "<br />\r\n"; 
    echo "<br />\r\n";
    
    echo "<hr />\r\n"; 
    
    $ausgabe = ""; 
    
    $desc1 = $descarray[0]; 
    unset($descarray[0]); 
    $desc2 = $descarray; 
    
    
    $ausgabe .= "<p style=\"text-align:left;\">\r\n"; 
    
    if (!empty($desc2)) { 
    
    $ausgabe .= "".$desc1." ...\r\n"; 
    $anzl = strlen($desc1);
    
    $ausgabe .= "<br />&nbsp;&nbsp;&nbsp; (Zeichen: ".$anzl.") \r\n"; 
    
    $stringarray = explode(".",$desc1); 
    $last = (count($stringarray) -1); 
    $ergebnis = $stringarray[$last]; // --- erster Satz für neuen Absatz --- 
    
    ## preg_match('/(?:[\.!?]\s)?([^\.!?]*[\.!?])$/', $desc1, $treffer);  // Es werden ". ", "! " und "? " als Satztrennzeichen geduldet
    ## $ergebnis = $treffer[1];
    
    /* --- 
    $desc1 = str_replace($ergebnis,"",$desc1); // --- (keine) Entfernung Rest-Satz im ersten Absatz ---
    --- */ 
    
    
    }
    else {
    $ausgabe .= "".$desc1."\r\n"; 
    }
    
    $ausgabe .= "</p>\r\n";
    
    
    
    if (!empty($desc2)) { 
    
    // -------------------------------- 
    $d = 0; 
    foreach($desc2 as $dstxt) { 
    
    $stringarray2 = explode(".",$dstxt); 
    $last2 = (count($stringarray2) -1); 
    $ergebnis2 = $stringarray2[$last2]; // --- erster Satz für nächsten Absatz --- 
    
    ## preg_match('/(?:[\.!?]\s)?([^\.!?]*[\.!?])$/', $dstxt, $treffer2);  // Es werden ". ", "! " und "? " als Satztrennzeichen geduldet
    ## $ergebnis2 = $treffer2[1];
    
    $dstxt = str_replace($ergebnis2,"",$dstxt); 
    
    
    if ($d == 0) { 
    $gostring = "".$ergebnis." ".$dstxt.""; 
    $anzl = strlen($gostring);
    
    $ausgabe .= "<p style=\"clear:both; text-align:left;\">\r\n"; 
    $ausgabe .= "".$gostring."\r\n"; 
    $ausgabe .= "<br />&nbsp;&nbsp;&nbsp; (Zeichen: ".$anzl.") \r\n"; 
    $ausgabe .= "</p>\r\n";
    
    }
    else { 
    $gostring = "".$ergebnis2." ".$dstxt.""; 
    $anzl = strlen($gostring);
    
    $ausgabe .= "<p style=\"clear:both; text-align:left;\">\r\n"; 
    $ausgabe .= "".$gostring."\r\n"; 
    $ausgabe .= "<br />&nbsp;&nbsp;&nbsp; (Zeichen: ".$anzl.") \r\n"; 
    $ausgabe .= "</p>\r\n";
    }
    
    $d++; 
    
    }
    // -------------------------------- 
    
    }
    
    
    echo "<br />\r\n";
    echo "<br />\r\n"; 
    
    echo $ausgabe; 
    
    echo "<br />\r\n";
    echo "<br />\r\n"; 
    
    
    ?>



    -----------------------
    TEST 2
    -----------------------
    Ausgabe test2.php hier: http://freecontent.lima-city.de/test2.php

    test2.php

    <?php
    
    $mystring = "One for all and all for one, Muskehounds are always ready. One for all and all for one, helping everybody. One for all and all for one, it's a pretty story. Sharing everything with fun, that's the way to be. One for all and all for one, Muskehounds are always ready. One for all and all for one, helping everybody. One for all and all for one, can sound pretty corny. If you've got a problem chum, think how it could be. There's a voice that keeps on calling me. Down the road, that's where I'll always be. Every stop I make, I make a new friend. Can't stay for long, just turn around and I'm gone again. Maybe tomorrow, I'll want to settle down, Until tomorrow, I'll just keep moving on. Hey there where ya goin', not exactly knowin', who says you have to call just one place home. He's goin' everywhere, B.J. McKay and his best friend Bear. He just keeps on movin', ladies keep improvin', every day is better than the last. New dreams and better scenes, and best of all I don't pay property tax. Rollin' down to Dallas, who's providin' my palace, off to New Orleans or who knows where. Places new and ladies, too, I'm B.J. McKay and this is my best friend Bear. I never spend much time in school but I taught ladies plenty. It's true I hire my body out for pay, hey hey. I've gotten burned over Cheryl Tiegs, blown up for Raquel Welch. But when I end up in the hay it's only hay, hey hey. I might jump an open drawbridge, or Tarzan from a vine. 'Cause I'm the unknown stuntman that makes Eastwood look so fine. Ulysses, Ulysses - Soaring through all the galaxies. In search of Earth, flying in to the night. Ulysses, Ulysses - Fighting evil and tyranny, with all his power, and with all of his might. Ulysses - no-one else can do the things you do. Ulysses - like a bolt of thunder from the blue. Ulysses - always fighting all the evil forces bringing peace and justice to all.";
    
    
    $maxzeichen1 = 300;   // ------ max. Text-Block Zeichen ------- 
    
    $neuertext = wordwrap( $mystring, $maxzeichen1, "{#}" );
    
    $descarray = explode("{#}", $neuertext); 
    
    
    echo "<br />\r\n"; 
    echo "<br />\r\n"; 
    echo "<br />".$mystring."\r\n"; 
    echo "<br />\r\n"; 
    echo "<br />\r\n";
    
    echo "<hr />\r\n"; 
    
    $ausgabe = ""; 
    
    $desc1 = $descarray[0]; 
    unset($descarray[0]); 
    $desc2 = $descarray; 
    
    
    $ausgabe .= "<p style=\"text-align:left;\">\r\n"; 
    
    if (!empty($desc2)) { 
    
    $ausgabe .= "".$desc1." ...\r\n"; 
    $anzl = strlen($desc1);
    
    $ausgabe .= "<br />&nbsp;&nbsp;&nbsp; (Zeichen: ".$anzl.") \r\n"; 
    
    ## $stringarray = explode(".",$desc1); 
    ## $last = (count($stringarray) -1); 
    ## $ergebnis = $stringarray[$last]; // --- erster Satz für neuen Absatz --- 
    
    preg_match('/(?:[\.!?]\s)?([^\.!?]*[\.!?])$/', $desc1, $treffer);  // Es werden ". ", "! " und "? " als Satztrennzeichen geduldet
    $ergebnis = $treffer[1];
    
    /* --- // --- (keine) Entfernung Rest-Satz im ersten Absatz ---
    $desc1 = str_replace($ergebnis,"",$desc1); 
    --- */ 
    
    
    }
    else {
    $ausgabe .= "".$desc1."\r\n"; 
    }
    
    $ausgabe .= "</p>\r\n";
    
    
    
    if (!empty($desc2)) { 
    
    // -------------------------------- 
    $d = 0; 
    foreach($desc2 as $dstxt) { 
    
    ## $stringarray2 = explode(".",$dstxt); 
    ## $last2 = (count($stringarray2) -1); 
    ## $ergebnis2 = $stringarray2[$last2]; // --- erster Satz für nächsten Absatz --- 
    
    preg_match('/(?:[\.!?]\s)?([^\.!?]*[\.!?])$/', $dstxt, $treffer2);  // Es werden ". ", "! " und "? " als Satztrennzeichen geduldet
    $ergebnis2 = $treffer2[1];
    
    // --- Entfernung Rest-Satz im Absatz ---
    $dstxt = str_replace($ergebnis2,"",$dstxt); 
    
    
    if ($d == 0) { 
    $gostring = "".$ergebnis." ".$dstxt.""; 
    $anzl = strlen($gostring);
    
    $ausgabe .= "<p style=\"clear:both; text-align:left;\">\r\n"; 
    $ausgabe .= "".$gostring."\r\n"; 
    $ausgabe .= "<br />&nbsp;&nbsp;&nbsp; (Zeichen: ".$anzl.") \r\n"; 
    $ausgabe .= "</p>\r\n";
    
    }
    else { 
    $gostring = "".$ergebnis2." ".$dstxt.""; 
    $anzl = strlen($gostring);
    
    $ausgabe .= "<p style=\"clear:both; text-align:left;\">\r\n"; 
    $ausgabe .= "".$gostring."\r\n"; 
    $ausgabe .= "<br />&nbsp;&nbsp;&nbsp; (Zeichen: ".$anzl.") \r\n"; 
    $ausgabe .= "</p>\r\n";
    }
    
    $d++; 
    
    }
    // -------------------------------- 
    
    }
    
    
    echo "<br />\r\n";
    echo "<br />\r\n"; 
    
    echo $ausgabe; 
    
    echo "<br />\r\n";
    echo "<br />\r\n"; 
    
    
    ?>



    ich hoffe Ihr könnt mir folgen, was ich damit vor habe ^^
    ---> einen langen Text in mehrere Absätze aufteilen, Umbruch nur am Satz-Ende


    PS: ich nehme $treffer[1] weil im $treffer[0] noch das Trenner-Teichen am Anfang mit dabei ist

    Was mach ist falsch in test2.php ?

    Danke!


    Beitrag zuletzt geändert: 18.9.2011 10:46:43 von freecontent
  5. freecontent schrieb:
    ... oder gibts "schönere" Lösungen als Vorschlag?

    also eigentlich nicht und ganz besonders nicht regexp! (wer das lesen mächtrig ist, kann selbst nach dem warum suchen!)
    man kann es nur etwas einfacher formulieren:
    <?php
    $mystring   = "Ich bin so blau. Ich bin so rot. Ich bin der Wassermann im Boot.";
    $lastphrase = end(explode('.', substr($mystring, 0, -1))) . '.';

    nebenbei; ähnlich einfach geht der erste satz:
    $firstphrase = reset(explode('.', substr($mystring, 0, -1))) . '.';


    ==== edit: ====
    zu deiner letzten mitteilung:
    <?php
    $text = "One for all and all for one, Muskehounds are always ready.
    One for all and all for one, helping everybody.
    One for all and all for one, it's a pretty story.
    Sharing everything with fun, that's the way to be.
    One for all and all for one, Muskehounds are always ready.
    One for all and all for one, helping everybody.
    One for all and all for one, can sound pretty corny.
    If you've got a problem chum, think how it could be.
    There's a voice that keeps on calling me.
    Down the road, that's where I'll always be.
    Every stop I make, I make a new friend.
    Can't stay for long, just turn around and I'm gone again.
    Maybe tomorrow, I'll want to settle down, Until tomorrow, I'll just keep moving on.
    Hey there where ya goin', not exactly knowin', who says you have to call just one place home.
    He's goin' everywhere, B.J. McKay and his best friend Bear.
    He just keeps on movin', ladies keep improvin', every day is better than the last.
    New dreams and better scenes, and best of all I don't pay property tax.
    Rollin' down to Dallas, who's providin' my palace, off to New Orleans or who knows where.
    Places new and ladies, too, I'm B.J. McKay and this is my best friend Bear.
    I never spend much time in school but I taught ladies plenty.
    It's true I hire my body out for pay, hey hey.
    I've gotten burned over Cheryl Tiegs, blown up for Raquel Welch.
    But when I end up in the hay it's only hay, hey hey.
    I might jump an open drawbridge, or Tarzan from a vine.
    'Cause I'm the unknown stuntman that makes Eastwood look so fine.
    Ulysses, Ulysses - Soaring through all the galaxies.
    In search of Earth, flying in to the night. Ulysses, Ulysses - Fighting evil and tyranny, with all his power, and with all of his might.
    Ulysses - no-one else can do the things you do.
    Ulysses - like a bolt of thunder from the blue.
    Ulysses - always fighting all the evil forces bringing peace and justice to all.";
    
    $xlen = 300;
    $a_text   = str_split ($text, $xlen);
    
    echo $text . '<hr />';
    
    foreach($a_text as $index) {
      echo substr($index, 0, strrpos($index, '.') + 1) . '<hr />';
    }
    exit('<pre>'.print_r($a_text,true));


    Beitrag zuletzt geändert: 18.9.2011 18:36:52 von hemiolos
  6. 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!