php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
BBCode List


 
Tpercon
14-08-2003, 18:11 
 
Mit dem folgenden Code wandel ich [ list] Tags um. Warum funktioniert der Code nur mit $mystring = " ".$mystring; am Anfang? Warum braucht der das Leerzeichen?
$mystring = $msg;
$mystring = " ".$mystring;

while (strpos($mystring, "[list") != false) {
$i = strpos($mystring, "[list");
$j = strpos($mystring, "[/list]");
if ($j === false) {
break;
}

if (strpos($mystring, "[list=") == $i) {
$sourcestring = substr($mystring, $i, $j + 6);
$replacestring = preg_replace("/\[list=(.*)](.*)\[\/list\]/siU","<ol start=\"\\1\">\\2</ol>", $sourcestring);
$replacestring = str_replace(" ", "<li>", $replacestring);
$mystring = str_replace($sourcestring, $replacestring, $mystring);
}
elseif (strpos($mystring, "[list]") == $i) {
$sourcestring = substr($mystring, $i, $j + 6);
$replacestring = preg_replace("/\[list](.*)\[\/list\]/siU","<ul>\\1</ul>", $sourcestring);
$replacestring = str_replace(" ", "<li>", $replacestring);
$mystring = str_replace($sourcestring, $replacestring, $mystring);
}

}

$msg = $mystring;

 
BrainBug
14-08-2003, 18:37 
 
was passiert denn wenn du's wegläßt?
Darf doch eigentlich nichts ausmachen.

 
Tpercon
14-08-2003, 23:05 
 
Nichts! Der BBCode wird unverändert ausgegeben.

 
mrhappiness
14-08-2003, 23:09 
 
mystring = $msg;
$mystring = " ".$mystring;
while (strpos($mystring, "[list") !== false) {probier das mal

 
BrainBug
15-08-2003, 09:44 
 
oder versuch die While-Schleife mal so:

$mystring=$msg;
while (strstr($mystring, "[list") == true) {

 
Tpercon
15-08-2003, 09:54 
 
Hm, wenn ich das $mystring = " ".$mystring; raus nehme, dann bekomme ich immer den Fehler "Fatal error: Maximum execution time of 5 seconds exceeded...".

 
BrainBug
15-08-2003, 09:58 
 
:confused:

hmm, was steht denn in $msg drin?
Und was nach der Übergabe in $mystring?

Hast du das schon ausgegeben?

Vergiss auch bitte meinen Vorschlag mit strstr(), ist wohl langsamer als strpos()

 
Tpercon
15-08-2003, 10:08 
 
Die Übergabe von $msg nach $mystring und später wieder zurück geht, da steht das gleiche drin.
Da muß also irgendwo in der Schleife (irgendwie ja ne Endlosschleife ohne das Leerzeichen) der Fehler stecken.
Vielleicht hat auch irgendwer zur Not nen anderen Ansatz (der sogar verschachtelte Listen unterstützt) für die Umwandlung?

 
Tpercon
15-08-2003, 22:41 
 
Hat keiner 'ne Idee, wo der Fehler liegen könnte?:(

Zur nt weich ich auch auf nen anderen Code aus, der muß dann aber zumindest verschachtelte Listen unterstützen.:)

 
BrainBug
18-08-2003, 09:21 
 
hab's mir mal angeschaut und das Problem liegt bei der Abfrage, d.h. mrhappiness hatte schon recht, als er !== vorgeschlagen hat. Dein Skript hört dann nämlich auf, wenn gleich an erster Position ein list-Tag steht -> da ist strpos davon "0", welches mit !=false verglichen wird. Und 0 ist nicht true, sondern false.
also, die Version mit den zwei Gleichheitszeichen benutzen und du kannst den Startstring weglassen. Bei mir hat's zumindest geklappt.

 
Tpercon
18-08-2003, 10:28 
 
Hm, seltsam!
Ich habe folgenden Code:
$mystring = $msg;
$mystring = " ".$mystring;

while (strstr($mystring, "[list") !== false) {
$i = strpos($mystring, "[list");
$j = strpos($mystring, "[/list]");
if ($j === false) {
break;
}

if (strpos($mystring, "[list=") === $i) {
$sourcestring = substr($mystring, $i, $j + 6);
$replacestring = preg_replace("/\[list=(.*)](.*)\[\/list\]/siU","<ol start=\"\\1\">\\2</ol>", $sourcestring);
$replacestring = str_replace(" ", "<li>", $replacestring);
$mystring = str_replace($sourcestring, $replacestring, $mystring);
}
elseif (strpos($mystring, "[list]") === $i) {
$sourcestring = substr($mystring, $i, $j + 6);
$replacestring = preg_replace("/\[list](.*)\[\/list\]/siU","<ul>\\1</ul>", $sourcestring);
$replacestring = str_replace(" ", "<li>", $replacestring);
$mystring = str_replace($sourcestring, $replacestring, $mystring);
}

}
// $mystring = preg_replace("/\[list=(.*)](.*)\[\/list\]/siU","<ol start=\"\\1\">\\2</ol>",$mystring);
$msg = $mystring;
Also mit !== und es geht weiterhin nur mit dem Leerzeichen! Auch >= 0 geht nicht ohne.

 
BrainBug
18-08-2003, 10:44 
 
ich habe den selben Code und bei mir läuft's bzw. einen Fehler gibt mir PHP zurück und der befindet sich im preg_replace ->
du mußt den Slash von Endtag maskieren, da du / als Delimiter für deinen regulären Ausdruck benutzt. also:
preg_replace("/[list=(.*)](.*)[\/list]/siU"...
beim zweiten preg_replace natürlich auch.

P.S.: So'n Shit. Schon wieder so ein Beispiel, dass das Forum hier manche Sachen einfach verschluckt. Es soll natürlich "\ / list" heissen. Oder hast du den Backslash bei dir eigentlich auch schon drin?

 
Tpercon
18-08-2003, 11:08 
 
@ BrainBug:
Ersetz mal bitte das
while (strstr($mystring, "[list") !== false) {durchwhile (strpos($mystring, "[list") !== false) { und schau mal ob es so läuft(bei mir halt nicht:( ). Ich benutze nämlich strpos, hatte es nur oben vergessen zu ändern.

PS: $replacestring = preg_replace("/\[list=(.*)](.*)\[\/list\]/siU","<ol start=\"\\1\">\\2</ol>", $sourcestring); Hab den Backslash also drinne.

 
BrainBug
18-08-2003, 12:22 
 
bei mir läuft's sowohl mit strstr() als auch mit strpos().

Hab heute leider nicht viel Zeit und kann dir im Augenblick leider nicht weiterhelfen. Morgen dann...

 
Tpercon
18-08-2003, 12:30 
 
Das wäre nett.

Vielleicht finde ich ja im Netz auch irgend nen fertigen Code dafür. Wollte es zwar eigentlich selbst machen, aber wenn das so nicht geht...


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:04 Uhr.