• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Funktion arbeitet bei zuvielen Zeichen nicht

CGollhardt

Mitglied
Guten Abend,

ich habe geradeeben eine Funktion geschrieben, mit der BBCode-PHPCode gehighlighted wird. Nun ist es aber so, dass diese Funktion bei sehr vielen Zeichen (Teststring count -> 13000) nicht mehr funktioniert.

Erstmal hier die Funktion
PHP:
function bbcode_code ($str) {
	if (preg_match ('/\[code\](.*?)\[\/code\]/is', $str, $codeVar) > 0) {
		for ($i = 1; $i < count($codeVar); $i++) {
			$originalString = html_entity_decode($codeVar[$i], ENT_QUOTES, 'UTF-8');
			$originalString = htmlspecialchars_decode($originalString, ENT_QUOTES);
			$str = str_replace ('[code]' . $codeVar[$i] . '[/code]', highlight_string($originalString, true), $str);
		}
	}
	return $str;
}

Nun habe ich gedacht, es könnte sein, dass PHP bei solangen Strings nicht mehr mit str_replace() arbeiten kann.

Folgende Testschleife kamm jedoch bis zum 60 Sekunden Timeout bis zu 35000. Dies wiederlegt es meiner Meinung nach:
PHP:
for ($i = 10000; $i <= 1000000; $i++) {
	$buchstaben = '';
	for ($x = 1; $x <= $i; $x++) {
		$buchstaben.= 'a';
	}
	echo str_replace ($buchstaben, strlen($buchstaben) . ' Zeichen konnten ersetzt werden!</br />', $buchstaben);
}


Als nächstes dachte ich an preg_replace, aber der Restliche BBCode funktioniert mit dem gesamten String auch.

Teststring Sieht ungefähr so aus:
Code:
Normaler BBCode, Fett, unterstrichen, link etc. dann
[code]Sehr sehr viel code
[/code]

Kann die Variable ARG3 in preg_match(ARG1, ARG2, ARG3) vielleicht nicht so viel speichern?

Wusste nicht wie ich das jetzt testen kann
 
Werbung:
Hast du error_reporting aktiviert? Setze ganz oben in die Datei:

PHP:
error_reporting(-1); // -1 = "alle Bits auf eins", siehe: printf('%b', -1);

Wenn du mehrere [noparse]
Code:
...
[/noparse]-Blöcke in deiner Eingabe hast, musst du zudem mit preg_match_all arbeiten, nicht mit preg_match. Deine Schleife ergibt an der Stelle deshalb keinen Sinn.

Die Größe eines Variableninhalts ist in PHP theoretisch nur durch die Menge an zur Verfügung stehendem Speicher für das Gesamtprogramm limitiert. Wenn der ausgeht, schmeißt PHP einen Fatal Error. Zum Beispiel:

PHP:
$x = range(0, 1000*1000*1000);

// Fatal error: Allowed memory size of 16777216 bytes exhausted
// (tried to allocate 20 bytes)

Meine beste Vermutung ist, dass das bei dir passiert. Ich halte sie aber selbst nicht für besonders gut, da wie gesagt ein Fatal Error angezeigt werden müsste und ich noch kaum eine Konfiguration erlebt habe, bei der die standardmäßig unterdrückt würden.

Die Vorgehensweise mit str_replace ist an der Stelle vielleicht nicht effizient, aber ich sehe bislang keinen Grund, warum es nicht so funktionieren sollte.
 
Danke schon mal für deine Hilfe,

Also error_reporting ist bei allen meinen Projekten generell auf E_ALL, zumindest in der Entwicklungsphase. Ist das gleich wie -1? Habe jetzt bei google nichts auf die schnelle gefunden.

Besagte Fehlermeldung wurden nicht ausgegeben.

Zwei
Code:
 Elemente mit kurzenen Inhalten funktionieren bei mir wunderbar. Also es kann nicht an preg_match_all liegen, oder? Speicher sollte kein Problem sein, denke ich (zumindest nach der Testschleife. Habe folgendes Paket: http://www.1blu.de/webhosting/performancepakete/paketl/ , sollte 100MB Arbeitsspeicher haben)

Der Fehler kommt erst, wenn der inhalt von [code] größer wird. Beispiel (Nur Momentan verfügbar): http://ggs-clan.de/design.php?seite=gastbuch

Der erste wird richtig interpretiert, der Zweite eintrag nicht.

Wie würdest du str_replace am besten ersetzen?
 
Werbung:
Ah okay, danke Ihre beiden. Beim ersten Teststring, waren es zwei mal dieselben Inhalte zwischen den Code Tags. Lag doch dran. Vielen Dank! Funktioniert jetzt soweit:
PHP:
function bbcode_code ($str) {
	if (preg_match_all ('/\[code\](.*?)\[\/code\]/is', $str, $codeVar) > 0) {
		for ($i = 0; $i < count($codeVar); $i++) {
			$originalString = html_entity_decode($codeVar[1][$i], ENT_QUOTES, 'UTF-8');
			$originalString = htmlspecialchars_decode($originalString, ENT_QUOTES);
			$str = str_replace ('[code]' . $codeVar[1][$i] . '[/code]', highlight_string($originalString, true), $str);
		}
	}
	return $str;
}
 
Zurück
Oben