Problem mit Regex

jdgf

Mitglied
Hallo,

ich will, dass der Ausgabetext mit einem ganzen Wort und den folgenden drei Pünktchen endet und nicht nur nach dem 65 Zeichen abgeschnitten wird. Bisheriger funktionierender Code ohne Verkürzung auf das letzte ganze Wort.:
PHP:
$res=mysql_query($test1);
    while ($dsatz = mysql_fetch_assoc($res))
    {	
		echo "<p>" .substr($dsatz["frage"], 0, 65) . " ...</p>";

Wenn ich jetzt den Code mit Regex ergänze, kommt in beiden Varianten eine Fehlermeldung.
PHP:
echo "<p>" .substr((preg_replace('#[^\s]*$#s', '', $dsatz["frage"]), 0, 65) . " ...</p>";

oder so:

PHP:
$dsatz = substr($dsatz,0,65);
		$text = preg_replace('#[^\s]*$#s', '', $dsatz);		
                echo "<p>" .$text . " ...</p>";

Wo liegt mein Fehler? Danke für die Hilfe!
Gruß, Dietmar
 
Du willst also nur den Text ach 65 Zeichen so abschneiden, dass das letzte Wort noch komplett zu lesen ist? Dann brauchst du kein RegEx.
PHP:
$text = "Ich bin ein Text mit weit über 65 Zeichen und soll nun nach 65 Zeichen so abgeschnitten werden, dass das letzte Wort noch komplett zu lesen ist!";
$cutpos = strpos($text, ' ', 65)
$text_cut = ( $cutpos === false ? $text : substr($text, 0, $cutpos).'...' );

Es gibt die Funktion strpos(), welche als 3. Parameter einen Offset im Text annimmt. Ab dort sucht er dann nach dem gesuchten Zeichen, in diesem Fall ein Leerzeichen. Je nachdem gibt er false ( = nichts gefunden -> Text komplett ausgeben )oder die Position zurück, wo man dann schneiden kann.

Gruß,
grubi
 
Das folgende gibt dir den Anfang des Textes mit vollständige Wörter und höchstens 65 Zeichen.

PHP:
if (preg_match("#(^.{0,65}\s)#s", $dsatz["frage"], $treffer)) {
    echo "<p>{$treffer[0]} ...</p>";
}

Was du machst mit preg_replace ist falsch. Um einen Substring zu kriegen solltest du mir preg_match arbeiten.

Du kannst die Ausdrücke gut online testen:
http://www.spaweditor.com/scripts/regex/index.php

Wenn du mit preg_replace arbeiten willst, dann sollte das etwa so aussehen
PHP:
echo preg_replace('#(.{0,65}\s)(.*)#s', '<p>${1}...</p>', $dsatz["frage"]);
 
Zuletzt bearbeitet:
Hallo Grubi und yaslaw,
Danke für eure Hilfe. Ich will es mit strpos durchführen und habe den Code so umgeschrieben:
PHP:
while($dsatz = mysql_fetch_assoc($ergebnis))
{
$ergebnis = strpos($dsatz["text"], " ", 65);
echo "<p><strong style=\"padding-right:5px\">".$dsatz["jahr"]."</strong>
<span style=\"color: #003399; font-weight:700;\">".$dsatz["name"]."</span>
<br>".substr($dsatz["text"], " ", $ergebnis)." ...</p>";
}

Der Text erscheint zwar richtig, aber auch eine Fehlermeldung
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /var/www/web539/html/images/scripts/kb_geburtstag_kurz.php on line 22

Die Zeile 22 beginnt mit
PHP:
while($dsatz = mysql_fetch_assoc($ergebnis))

Muss ich den Befehl mysql_fetch_assoc ändern?

Gruß Dietmar
 
Du verwendest $ergebnis sowohl für mysql_fetch_assoc() als auch für den Rückgabewert von strpos, darum meckert die MySQL-Funktion.
 
Zurück