Willkommen in der Webstatt Zum Webstatt Blog und Stories
fish fish am 04.09.06 18:47

HALLO LIEBE COMMUNITY

ich bin auf der suche nach einer leicht zu ergänzenden bbcodes funktion leider nicht fündig geworden, und versuche mich deshalb an der bbcodesfunktion von php4u.net

und dabei tauchen ein paar probleme auf.

-links wie http://www.web.de werden nicht umgwandelt wenn sie nach einem abasatz stehen
-verschachtelungen von quote und code funktionieren nicht.
-wie kann ich die variablen für den text (zb \\1) umbenennen in $text_1 $text_2 oder wenn dass nicht geht $1 , $2 etc
wie kann ich diese probleme lösen

netcup.de Warum gibt es hier Werbung?
fish fish am 04.09.06 19:30

KEINER ??(

crooked am 04.09.06 19:35

btw: fehler im design?

was meinst du mit nach nem absatz?

fish fish am 04.09.06 19:39

http://fish.bierquartier.de/test/php4u/test.php
hier kanste das testen.. gib mal das ein dann siehst du was ich meine...

Quote

http://www.web.de irgendeintesttexttext http://www.web.de
http://www.web.de

absatz

http://www.web.de

Thiemm Thiemm am 04.09.06 19:41

Da greift das Suchmuster wohl nur auf die erste Zeile zu. Versuchs mal mit dem s-Modifier (\s).

fish fish am 04.09.06 19:43

err wo genau im code soll ich den denn anwenden?

fish fish am 04.09.06 20:50

habe den code ein wenig umgebaut und "si" eingefügt an den sntsprechenden stellen.
if($url) {
$text = preg_replace('"(|^)(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)"si','\\1<a href="http://\2" target="_blank">\\2</a>', $text);
$text = preg_replace('"(|^)(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)"si',
'\\1<a href="http://\2" target="_blank">\\2</a>', $text);
$text = preg_replace('"([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})"si',
'<a href="mailto:\1">\\1</a>', $text);
}


funktionieren tut es leider immer noch nicht. woran kann es liegen

Thiemm Thiemm am 05.09.06 18:59

Ich kenne mich da ehrlich gesagt auch nicht so gut mit aus. Michael sollte dir aber dabei helfen können :rolleyes:

fish fish am 05.09.06 19:05

kann er zu diesem thema leider nicht ;)

oder meisntu micha?

Michael Michael am 05.09.06 19:52

Wie in ICQ gesagt bei mir klappen die preg_replace mit si und ohne das Leerzeichen am Anfang (also nun mit (|^)) einwandfrei.

Ich kann den Fehler einfach nicht nachvollziehen :(

milahu milahu am 05.09.06 20:00

Hab auch mal etwas rumgespielt.. ;)

$text = preg_replace_callback(
'"(\w+://)?(\w*\.?\w+\.\w+/?\S*)"',
create_function(
'$m',
'return \'<a href="\'.(strlen($m[1])?$m[1]:"http://").$m[2].\'">\'.$m[1].$m[2].\'</a>\';'
),
$text
);

Callback musste leider sein -- dafür werden verschiedene Protokolle und protokolllose URLs erkannt

fish fish am 05.09.06 21:05

hmm

also sieht schon besser aus. aber die ausgabe ist dann jetzt so..
<a href="http://www.web.de<br">http://www.web.de<br</a> />

milahu milahu am 05.09.06 21:19

Hinter der URL muss ein Leerzeichen oder Zeilenumbruch stehen, also nl2br erst danach anwenden

fish fish am 05.09.06 21:49

danke!, damit hätten wir teil eins meiner frage geklärt. teil zwei und drei sind aber immer noch offen: wie kann ich quallcode und quoten beliebig oft ineinanderverschgachteln und wie kann ich die verwirrenden variablen umbenennen

Franky Franky am 05.09.06 22:34

verwirrende variablen?

ich glaube ich würde an deiner stelle einfach die wbb-parseclass ändern und nehmen...

nuit nuit am 06.09.06 15:47

wenn du verschachtelte sachen haben willst...das ist ein bisschen aufwendiger ;)

vom wbb würde ich es nicht nehmen ;) aber schau dir mal phpBB an, dass kannste ja weiterverwenden ist ja openSource.

wie es recht einfach geht:
$text = str_replace('[ quote ]','<div class="quote"><p>',$text);
$text = str_replace('[/ quote ]','</p></div>,$text');


das sollte eigenltich auch verschachtelte bearbeiten ;)....aber wenn mal der schluss vergessen wurde, dann zerhauts das ganze..das könnte man ja noch abfangen, indem man beide zählt, wieviele vorkommen

fish fish am 06.09.06 17:37

schön, kannst du mir auch erklären wie ich das mit dem zählen mache?

fish fish am 07.09.06 18:30

weiss keiner wie das geht?

fish fish am 10.09.06 10:35

schade:(

fish fish am 10.09.06 18:53

na schön, dann eine andere frega: warum kann ich den URL-Tag nicht mehr benutzen und einem link einen anderen namen zuweisen?

http://fish.bierquartier.de/test/php4u/test.php

LIES HIER ÜBERHAUPT NOCH JEMAND?

milahu milahu am 10.09.06 20:19

Sry.. :O

Welche Modifikation is das denn jetz genau? Mein URL-Algo is das auf jeden Fall nicht.. ;)

Ein Stückchen Pseudocode zur Verschachtelungs-Analyse:

Solange zu ersetzende Elemente existieren
> Erstes öffnendes Element finden, Position speichern
> Weitersuchen
> > Wenn weitere öffnende Elemente desselben Typs gefunden werden, diese beginnen zu zählen
> > Wenn weitere schließende Elemente desselben Typs gefunden werden, den Zählerstand runtersetzen
> Sobald der Zähler auf Null ist, wurde dasentsprechende schließende Element zu obigem ersten gefunden
> Den ganzen Krempel nun ersetzen

fish fish am 10.09.06 20:32

danke.
hm also gut hier poste ich mal den code, dann kann mir vll jemand sagen,
wo das URL problem liegt.
<?php
function no_spam($mail)
{
$str = "";
$a = unpack("C*", $mail[1]);
foreach ($a as $b)
$str .= sprintf("%%%X", $b);
$mail[1] = str_replace(".", " [punkt] ", $mail[1]);
$link = str_replace("@", " [ät] ", $mail[1]);

return "<a href=\"mailto:".$str."\">".$link."</a>";
}

function bbcode($text, $url = TRUE, $bb = TRUE) {
/********************************************************************
*
* Autor: Michael Müller, 30.07.2003, 17:55
*
* $url -> TRUE, wenn URls automatisch umgewandelt werden sollen
* $bb -> TRUE, wenn BB-Code umgewandelt werden soll
*
* Erklärung:
* werden zu <b> und </b>
* werden zu <i> und </i>
* werden zu <u> und </u>
*

werden zu <ul> und </ul>
* [list=a] [/list] werden zu <ol type="a"> und </ol>
* [list=1] [/list] werden zu <ol type="1"> und </ol>
*
* [*]... wird zu <li>...</li>
* [align=center] [/align] wird zu <div align="center"> und </div>
*
* [color=red] [/color] wird zu <font color="red"> und </font>
*
* [size=1] [/size] wird zu <font size="1"> und </font>
*
* [img] [/img] werden zu <img src="...">
* --> siehe Config
* [ php] [/ php] --> siehe Config
*
Quote
--> siehe Config
* [url=...]...[/url] wird zu <a href="..." target="_blank">...</a>
* [email=...]...[/email] wird zu <a href="mailto:...">...</a>
********************************************************************/


# Config #
$max_l = 100; // maximale Länge eines Wortes
$lword_replace = "-<br />"; // Lange Wörter werden getrennt durch...

//Pfad zu den Smilie-Bildern, (mit abschließendem /, also zb "bilder/smilies/"):
$smilie_pfad = "smilies/";

// Header und Footer beschreiben, wie...
// der farbige PHP-Code umschlossen wird
$header_php = '<br/><br/><div>PHP-CODE:<br/><br/><code>';
$footer_php = '</code></div><br/>';

// Zitate umschlossen werden
$header_quote = '<br/><br/><div><i>Zitat:</i><br/>';
$footer_quote = '</div><br/>';

// normaler code umschlossen wird
$header_code = '<br/><br/><div>CODE:<br/><br/><pre>';
$footer_code = '</pre></div><br/>';
# Ab hier nichts mehr ändern #

#####################################################################


# PHP-Code-Blöcke zwischenspeichern #
$c = md5(time());
$pattern = "/\[php\](.*?)\[\/php\]/si";
preg_match_all ($pattern, $text, $results);
for($i=0;$i<count($results[1]);$i++) {
$text = str_replace($results[1][$i], $c.$i.$c, $text);
}
# PHP-Code-Blöcke zwischenspeichern #

# alles, was die Codeblöcke nicht betrifft #
// zu lange Wörter kürzen
$text = htmlentities($text);
$lines = explode("\n", $text);
$merk = $max_l;
for($n=0;$n<count($lines);$n++) {
$words = explode(" ",$lines[$n]);
$count_w = count($words)-1;
if($count_w >= 0) {
for($i=0;$i<=$count_w;$i++) {
$max_l = $merk;
$tword = trim($words[$i]);
$tword = preg_replace("/\[(.*?)\]/si", "", $tword);
$all = substr_count($tword, "http://") + substr_count($tword, "https://") + substr_count($tword, "www.") + substr_count($tword, "ftp://");
if($all > 0) {
$max_l = 200;
}
if(strlen($tword)>$max_l) {
$words[$i] = chunk_split($words[$i], $max_l, $lword_replace);
$length = strlen($words[$i])-5;
$words[$i] = substr($words[$i],0,$length);
}
}
$lines[$n] = implode(" ", $words);
} else {
$lines[$n] = chunk_split($lines[$n], $max_l, $lword_replace);
}
}
$text = implode("\n", $lines);
//$text = htmlentities($text);


// URLs umformen
if($url) {
$text = preg_replace_callback(
'"(\w+://)?(\w*\.?\w+\.\w+/?\S*)"',
create_function(
'$m',
'return \'<a href="\'.(strlen($m[1])?$m[1]:"http://").$m[2].\'">\'.$m[1].$m[2].\'</a>\';'
),
$text
);
//$text = preg_replace('"((|^)((ftp|http|https){1}://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)"si',
// '<a href="\1" target="_blank">\\1</a>', $text);
//$text = preg_replace('"(|^)([URL]www.[/URL][-a-zA-Z0-9@:%_\+.~#?&//=]+)"si',
// '\\1<a href="http://\2" target="_blank">\\2</a>', $text);
$text = preg_replace_callback('"([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})"si', 'no_spam', $text);

}

// BB-Code
if($bb) {
//fetgedruckt
$text = preg_replace("/\[b\](.*?)\[\/b\]/si",
"<b>\\1</b>", $text);
//kursiv
$text = preg_replace("/\[i\](.*?)\[\/i\]/si",
"<i>$1</i>", $text);
//unterstrichen
$text = preg_replace("/\[u\](.*?)\[\/u\]/si",
"<u>\\1</u>", $text);
//liste
$text = preg_replace("/\[list\](.*?)\[\/list\]/si",
"<ul>\\1</ul>", $text);
//listenpunkt
$text = preg_replace("/\[list=(.*?)\](.*?)\[\/list\]/si",
"<ol type=\"\\1\">\\2</ol>", $text);
//listenpunkt
$text = preg_replace("/\[\*\](.*?)\\n/si",
"<li>\\1</li>", $text);
//unterstrichen
$text = preg_replace("/\[h1\](.*?)\[\/h1\]/si",
"<span class=\"ueberschrift\">\\1</span><br/>", $text);

//ausrichtung
$text = preg_replace("/\[align=(.*?)\](.*?)\[\/align\]/si",
"<div align=\"\\1\">\\2</div>", $text);

//schriftfarbe
$text = preg_replace("/\[color=(.*?)\](.*?)\[\/color\]/si",
"<font color=\"\\1\">\\2</font>", $text);
//schriftgröße
$text = preg_replace("/\[size=(.*?)\](.*?)\[\/umfliessen\]/si",
"<font size=\"\\1\">\\2</font>", $text);
//bild
$text = preg_replace("/\[img\](.*?)\[\/img\]/si",
"<img src=\"\\1\" border=\"0\" alt=\"bild\"/>", $text);
//bild mit alt-tag
$text = preg_replace("/\[img=(.*?)\](.*?)\[\/img\]/si",
"<img src=\"\\1\" border=\"0\" alt=\"\\2\"/>", $text);

//links/rechts umflossen
$text = preg_replace("/\[umfluss=(.*?)\](.*?)\[\/umfluss\]/si",
"<span class=\"\\1\">\\2</span>", $text);
//ueberschrift
$text = preg_replace("/\[h1\](.*?)\[\/h1\]/si",
"<span class=\"h1\">\\1\</span><br/>", $text);
//codeblock
$text = preg_replace("/\[code\](.*?)\[\/code\]/si",
$header_code.'\\1'.$footer_code, $text);
//link
$text = preg_replace("/\[url=http:\/\/(.*?)\](.*?)\[\/url\]/si",
"<a href=\"http://\\1\" target=\"_blank\">\\2</a>", $text);
//link mit name
$text = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/si",
"<a href=\"http://\\1\" target=\"_blank\">\\2</a>", $text);
//emailadresse
$text = preg_replace("/\[email](\w+?)@(\w+?)\.(\w+?)\](.*?)\[\/email\]/si",
'$4 &lt;$1 bei $2 punkt $3&gt;', $text);

//SMILIES
//------------------------------------------------------------------------------------------
//:D
$text = preg_replace("/\:D/si",
"<img src=\"".$smilie_pfad."grin.gif\" alt=\"*grins*\"/>", $text);
//:-D
$text = preg_replace("/\:-D/si",
"<img src=\"".$smilie_pfad."biggrin.gif\" alt=\"*grins*\"/>", $text);

//:|
$text = preg_replace("/\:\|/si",
"<img src=\"".$smilie_pfad."worried.gif\" alt=\"*worried*\"/>", $text);

//;)
$text = preg_replace("/\;\)/si",
"<img src=\"".$smilie_pfad."wink.gif\" alt=\"*zwinker*\"/>", $text);

//:P
$text = preg_replace("/\:P/si",
"<img src=\"".$smilie_pfad."tongue.gif\" alt=\"*worried*\"/>", $text);
//:P
$text = preg_replace("/\:-P/si",
"<img src=\"".$smilie_pfad."tongue.gif\" alt=\"*worried*\"/>", $text);

//;P
$text = preg_replace("/\;P/si",
"<img src=\"".$smilie_pfad."tongue.gif\" alt=\"*worried*\"/>", $text);

//o0
$text = preg_replace("/0o/si",
"<img src=\"".$smilie_pfad."suspicious.gif\" alt=\"*hmm*\"/>", $text);







//zitat
while(preg_match('/\[quote\](.*?)\[\/quote\]/isU', $text)) {
$text = preg_replace('/\[quote\](.*)\[\/quote\]/si',
$header_quote.'\\1'.$footer_quote,
$text);
}

}
# alles, was die Codeblöcke nicht betrifft #

# PHP-Code-Blöcke umwandeln #
for($i=0;$i<count($results[1]);$i++) {
ob_start();
highlight_string(trim($results[1][$i]));
$ht = ob_get_contents();
ob_end_clean();
$all = $header_php.$ht.$footer_php;
if(function_exists("str_ireplace")) {
$text = str_replace("[ php]".$c.$i.$c."[/ php]",$all,$text);
} else {
$text = str_replace("[ php]".$c.$i.$c."[/ php]",$all,$text);
$text = str_replace("".$c.$i.$c."[/ php]",$all,$text);
}
}
# PHP-Code-Blöcke umwandeln #

$text = nl2br($text);
// Text zurückgeben
return $text;
}
?>
milahu milahu am 10.09.06 22:50

Den Code hättest ruhig kürzen können :S

Momentan schnappt sich mein RegEx alle URLs, die er/sie/es auftreiben kann, also auch die in BB-URL-Tags.

Sprich: [ url=foo ]bar[ /url ] wird dann zu [ url=<a href="http://foo">foo</a> ]bar[ /url ]
.. was dann aber wiederum vom BB-Code Parser weiterverarbeitet wird und letztendlich Müll ergibt.

Darum:
$text = preg_replace_callback(
'"(\w+://)?(\w*\.?\w+\.\w+/?\S*)"',
create_function(
'$m',
'return (in_array($m[1][0], array("=", "]")) || in_array($m[2][0], array("=", "]"))) ? $m[0] : \'<a href="\'.(strlen($m[1])?$m[1]:"http://").$m[2].\'">\'.$m[1].$m[2].\'</a>\';'
),
$text
);

Wenn nun = oder ] vor der URL gefunden wird, wird nix ersetzt.

..langsam wird's dirrrty! :-\

fish fish am 11.09.06 01:01

danke..
aber da läuft noch ein kleines bischen was schief, dein code frisst das vorherige = zeichen auf, ich muss also (url==www.web.de) eingeben..

milahu milahu am 11.09.06 10:11

Jetz aber..

fish fish am 11.09.06 10:26

cool... jetzt wird aber leider aus [URL]www.[/URL] web.de ww. web.de er frisst ein w in der umwandlung

milahu milahu am 11.09.06 10:35

Nochma!

fish fish am 11.09.06 10:41

<a href="http://<a href="http://www.web.de" target="_blank">link</a>"> ...
ist jetzt die ausgabe von [ url=www.web.de]link[ /url]

milahu milahu am 11.09.06 12:04

Und nu..?
$text = preg_replace_callback(
'"(\s)(\w+://)?((\w+\.)?[\w-:;&()@]+?\.\w+/?\S*)"',
create_function(
'$m',
'if ($m[1] != \'\') {
$protokoll = strlen($m[2])?$m[2]:\'http://\';
$url = $protokoll.$m[3];
return $m[1].\'<a href="\'.$url.\'">\'.$m[2].$m[3].\'</a>\';
} else
return $m[0];'
),
"\n".$text
);
$text = trim($text);

Folgendes hat er bei mir brav "übersetzt":
webstatt.org
jabber://doedl@webstatt.org
webstatt

<a href="http://webstatt.org">webstatt.org</a>
<a href="jabber://doedl@webstatt.org">jabber://doedl@webstatt.org</a>
webstatt

fish fish am 11.09.06 12:14

DANKE!
SUPER!

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt