Willkommen in der Webstatt
User-1 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?
User-1 am 04.09.06 19:30

KEINER ??(

User-2 am 04.09.06 19:35

btw: fehler im design?

was meinst du mit nach nem absatz?

User-1 am 04.09.06 19:39

http://xyz-70.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

User-3 am 04.09.06 19:41

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

User-1 am 04.09.06 19:43

err wo genau im code soll ich den denn anwenden?

User-1 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

User-3 am 05.09.06 18:59

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

User-1 am 05.09.06 19:05

kann er zu diesem thema leider nicht ;)

oder meisntu micha?

User-4 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 :(

User-5 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

User-1 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> />

User-5 am 05.09.06 21:19

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

User-1 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

User-6 am 05.09.06 22:34

verwirrende variablen?

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

User-7 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

User-1 am 06.09.06 17:37

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

User-1 am 07.09.06 18:30

weiss keiner wie das geht?

User-1 am 10.09.06 10:35

schade:(

User-1 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://xyz-70.bierquartier.de/test/php4u/test.php

LIES HIER ÜBERHAUPT NOCH JEMAND?

User-5 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

User-1 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: xyz-141el 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;
}
?>
User-5 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! :-\

User-1 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..

User-5 am 11.09.06 10:11

Jetz aber..

User-1 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

User-5 am 11.09.06 10:35

Nochma!

User-1 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]

User-5 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

User-1 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