Seite lädt unendlich

mediaroad

Mitglied
Hallo zusammen,

ich habe schon gegooglet, im Forum geguckt und leider keine Lösung zu meinem Problem gefunden.

Das untenstehende PHP-Sript wurde von unserem internen PHP Entwickler geschrieben und ich muss es jetzt anpassen.

PHP:
<?php
	$valuetext = $dbpagesrow->text;
	$valuetext = split(" ",$valuetext);
	$valuemass = count($valuetext);
	$valuemass1 = $valuemass/100*51;
	$valuemass2 = $valuemass/100*49;
	$countx=0;
	for($count = 0; $count < $valuemass1 || (strpos($valuetext[$count],".")==0 && strpos($valuetext[$count],"!")==0 && strpos($valuetext[$count],"?")==0); $count++)
    {
    	$valuetext1.=$valuetext[$count]." ";
    }
	if(strpos($valuetext[$count],"</p>".chr(13).chr(10)."<p>")==0){
		$valuetext1.=$valuetext[$count]." ";
	} else {
		$valuesplit=split("</p>".chr(13).chr(10)."<p>",$valuetext[$count]);
		$valuetext1.=$valuesplit[0]."</p>".chr(13).chr(10);
		$valuetext2.="<p>".$valuesplit[1]." ";
	}
	for($count1 = $count+1; $count1 < $valuemass1+$valuemass2; $count1++)
    {
	   	$valuetext2.=$valuetext[$count1]." ";
    }
?>

Ich pflege durch eine Datenbank Text ein und mein Problem ist, dass die Seite, in der das Script includiert ist, unendlich lange lädt. Das passiert aber nur, wenn ich wenig Text habe, d.h. wenn ich den bestehenden Text doppelt einpflege, lädt er die Seite normal und zeigt dann natürlich auch den Text zweimal an.

Ich hoffe ich habe mich verständlich ausgedrückt. Habt bitte ein wenig Nachsicht, ich kenne mich mit PHP nicht so gut aus. :)

Ich danke schonmal im voraus
 
Hi,

warum wendest Du Dich damit nicht an Euren internen PHP-Entwickler? Der wird doch dafür bezahlt. Und immerhin hat er das Ding verzapft und weiß wenigstens, was dieses Script überhaupt machen soll und wo das Problem sein könnte.

LG
 
Ich vermute den Fehler mal in der ersten forSchleife.

Würde ich auch ermuten, und zwar hier:
Code:
for($count = 0; 
    $count < $valuemass1 
      || 
    (strpos($valuetext[$count],".")==0 
      && 
     strpos($valuetext[$count],"!")==0 
      && 
     strpos($valuetext[$count],"?")==0); 
     $count++)

strpos() liefert ja die Position des Suchstrings, falls er nicht gefunden wurde, ein false

Der Vergleich ==0 trifft zu, wenn der gesuchte String am Anfang steht, oder wenn er nicht gefunden wurde.

Ich weiss jetzt nicht, ob das Skript auf das erstere oder letztere prüfen soll, auf jeden Fall:
Wenn geprüft werden soll, ob der String am Anfang steht, schreibe
Code:
===0
un wenn geprüft werden soll, ob der String nicht gefunden wurde
Code:
===false
...also auch den Typ der Rückgabe von strpos() vergleichen.
(Wenn ich den Code nochmal lese, macht nur das letztere Sinn :-) )
 
Entschuldigt für die späte Rückmeldung, aber eigentlich dachte ich dieses Thread wäre nicht mehr da, da ich ihn gestern gleich wieder gelöscht hatte, nachdem der "Fehler" weg war. Aufeinmal...ja und so schnell wie er weg war ist er auch wieder da.

Nun habe ich die Änderungen mal versucht und es funktioniert leider nicht, weiß nur nicht ob ich das so richtig gemacht hab.

PHP:
for($count = 0; $count < $valuemass1 || (strpos($valuetext[$count],".")===0 && strpos($valuetext[$count],"!")===0 && strpos($valuetext[$count],"?")===0); $count++)

PHP:
for($count = 0; $count < $valuemass1 || (strpos($valuetext[$count],".")===false && strpos($valuetext[$count],"!")===false && strpos($valuetext[$count],"?")===false); $count++)

Beide Varianten funktionieren nicht. Es tut mir leid wenn ich mich zu blöd anstelle, aber ich hab bei PHP noch nicht wirklich den Überblick.

Aber vielen Dank für die Hilfe und die Nachsicht ;)
 
Hi,

ich habe das Script mal mit folgendem Text aus dem PHP-Manual getestet:

Die Zeichenkette oder das Array mit Zeichenketten zum Ersetzen. Falls dieser Parameter eine Zeichenkette ist und der Parameter pattern ein Array, werden alle Suchmuster durch diese Zeichenkette ersetzt. Falls sowohl pattern als auch replacement Arrays sind, wird jedes pattern durch das Gegenstück aus replacement ersetzt. Wenn das replacement -Array weniger Elemente hat als das pattern -Array, wird jedes überzählige pattern durch die leere Zeichenkette ersetzt.

replacement darf Referenzen in der Form \\n oder (ab PHP 4.0.4) $n enthalten, wobei Letztere vorzuziehen ist. Jede dieser Referenzen wird mit dem Text ersetzt, der vom n-ten eingeklammerten Suchmuster erfasst wurde. n kann einen Wert von 0 bis 99 haben. \\0 oder $0 beziehen sich auf den Text, der auf das komplette Suchmuster passt. Um die Nummer des erfassenden Teil-Suchmusters zu erhalten, werden öffnende Klammern mit 1 beginnend von links nach rechts gezählt. Um einen Backslash im Ersatz zu verwenden, muss er verdoppelt werden ("\\\\" PHP-Zeichenkette).

Wenn Sie mit einer Ersetzung arbeiten wollen, in der auf eine Rückreferenzierung direkt eine weitere Zahl folgt (d.h., direkt nach der Übereinstimmmung mit einem Suchmuster soll eine Zahl kommen), können Sie für Ihre Rückreferenzierung nicht die Schreibweise \\1 verwenden. So würde z.B. \\11 die Funktion preg_replace() verwirren, weil sie nicht weiß, ob Sie die Rückreferenzierung \\1 gefolgt von der Zahl 1 wollen oder nur die Rückreferenzierung \\11. In diesem Fall ist die Lösung, \${1}1 zu verwenden. Damit wird eine isolierte Rückreferenzierung $1 erzeugt und die 1 bleibt ein Buchstabensymbol.

Wenn Sie den Modifikator e verwenden, maskiert diese Funktion ein paar Zeichen (nämlich ', ", \ und NULL) in den Zeichenketten, mit denen die Rückreferenzierungen ersetzen werden. Das wird gemacht, um sicherzustellen, dass keine Syntaxfehler entstehen, wenn Rückreferenzierungen verwendet werden, die einfache oder doppelte Anführungszeichen enthalten (z.B. 'strlen(\'$1\')+strlen("$2")'). Vergewissern Sie sich, dass Sie die Zeichenketten-Syntax von PHP kennen, um genau zu wissen, wie die ausgewertete Zeichenkette aussieht.

Das Ergebnis war eine ziemlich gleichmäßige Verteilung auf die beiden Variablen. Poste doch mal ein Beispiel, das sehr ungleichmäßig verteilt wird und eins, bei dem das Script nicht stoppt.

LG
 
Hallo nochmal,

hier habe ich mal ein paar Screenshots. Bei den ersten beiden sieht man, dass der Text nicht proportional gleichmäßig verteilt ist.

Bei dem 3. Screenshot musste ich den ersten Absatz nocheinmal am Ende wiederholen, sonst hätte er die Seite unendlich geladen.

Wenn ich Lorem ipsum Text als Platzhalter einfüge, verteilt er den Text auch relativ gleichmäßig nur bei dem "richtigen" Text spinnt er rum.

Ich glaube, dass hat was mit den Zeichen zählen zu tun. Die Frage ist, ob man das Script nicht lieber umschreibt, dass er Wörter zählt. Dann wäre nur die Frage wie.

lg
 

Anhänge

  • Unbenannt-1.jpg
    Unbenannt-1.jpg
    257,8 KB · Aufrufe: 24
  • Unbenannt-2.jpg
    Unbenannt-2.jpg
    151,8 KB · Aufrufe: 22
  • Unbenannt-3.jpg
    Unbenannt-3.jpg
    225,4 KB · Aufrufe: 21
Hi,

hier habe ich mal ein paar Screenshots.

Schön, aber wie ein ungleichmäßig verteilter Text aussieht, können wir uns glaube ich alle vorstellen. Du erwartest jetzt aber nicht, dass das jemand zum Testen abtippt, oder? ;)

Ich glaube, dass hat was mit den Zeichen zählen zu tun. Die Frage ist, ob man das Script nicht lieber umschreibt, dass er Wörter zählt. Dann wäre nur die Frage wie.

Es werden doch Wörter gezählt:

PHP:
$valuetext = split(" ",$valuetext);
$valuemass = count($valuetext);

Ich glaube eher, dass das an den HTML-Tags liegt, die da offensichtlich drin sind. Was hat denn eigentlich HTML in der Datenbank zu suchen?
Und deshalb bräuchte man zum Testen auch Strings, genauso, wie sie in der Datenbank stehen.

LG
 
Ok, ich habe jetzt erstmal eine vorübergehende Lösung gefunden. Diese ist zwar noch nicht so schön, aber für erste reicht sie.

Ich habe einfach hinzugefügt, dass er bei einem <br /> auch die Spalten trennen soll.

PHP:
for($count = 0; $count < $valuemass1 || (strpos($valuetext[$count],".")==0 && strpos($valuetext[$count],"!")==0 && strpos($valuetext[$count],"?")==0 && strpos($valuetext[$count],"</p>".chr(13).chr(10)."<p>")==0); $count++)

Aber ich danke euch trotzdem :)

lg
 
Zurück