Willkommen in der Webstatt Zum Webstatt Blog und Stories
fish fish am 16.11.06 19:25

soh liebe freunde der gepflegeten php-programmierung, ich habe eine frage an euch:

es geht dabei um folgenden codeschnipsel:

$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].\'[url=\'.$url.\']\'.$m[2].$m[3].\'[/url]\';
}

else return $m[0];'
),
"\n".$text
);


also wenn im $text folgende sachen stehen, soll die die funktion angwewndet werden:
http://www.web.de
http://www.web.de
web.de
http://web.de

für folgende textbeispiele soll sie nicht angwewndet werden:
21.00092
.66
tag.nacht

also insgesamt sollen alle möglichen arten von links umgweandelt werden alles andere nicht...
wie kann man das genauer festlegen

netcup.de Warum gibt es hier Werbung?
fish fish am 19.11.06 15:07

weiss keiner was?

BNightSpeeder am 19.11.06 15:23

Ich würde die function jetzt noch ganz unten reinmachen und es müsste gehen.

<?
$test = "web.de";


if (strstr($test, "www")){
$ja = "1";
}

if (strstr($test, "http://")){
$ja = "1";
}

if (strstr($test, ".de")){
$ja = "1";
}

//Ausführen

if (isset($test)){
// Irgendwas was ausgeführt werden soll..
}
?>

fish fish am 21.11.06 21:01

hmmm kannste das mal in das folgende beispiel einbauen ich weiss net soo ganz genau wie ich das machen soll..

<?php
function bbcodes($text, $url = TRUE, $bb = TRUE) {

# 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 = "images/smilies/";

// Header und Footer beschreiben, wie...
// der farbige PHP-Code umschlossen wird
$header_php = '<br/><span class="code_ueberschift">php code</span><span class="code_php"><code>';
$footer_php = '</code></span><br/>';

// Zitate umschlossen werden
$header_quote = '<br/><span class="code_ueberschift">zitat</span><span class="code_php">';
$footer_quote = '</span><br/>';

// normaler code umschlossen wird
$header_code = '<br/><span class="code_ueberschift">code</span><span class="code_code"><code>';
$footer_code = '</code></span><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);

// URLs umformen
if($url) {
//$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,6})"si', 'no_spam', $text);

$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].\'[url=\'.$url.\']\'.$m[2].$m[3].\'[/url]\';
}
else return $m[0];'
),
"\n".$text
);
$text = trim($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=\"ueberschrift\">\\1\</span><br/>", $text);

//youtube / ect video
$text = preg_replace("/\[video\](.*?)\[\/video\]/si",
"<object type=\"application/x-shockwave-flash\" style=\"width:250px; height:205px\" data=\"\\1\"><param name=\"movie\" value=\"\\1\"></param></object>", $text);

//ueberschrift
$text = preg_replace("/\[h2\](.*?)\[\/h2\]/si",
"<span class=\"unter_ueberschrift\">\\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\" title=\"diesem link folgen\">\\2</a>", $text);
//link mit name
$text = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/si",
"<a href=\"http://\\1\" title=\"diesem link folgen\">\\2</a>", $text);
//emailadresse
$text = preg_replace("/\[email](\w+?)@(\w+?)\.(\w+?)\](.*?)\[\/email\]/si",
'$4 &lt;$1 bei $2 punkt $3&gt;', $text);

//die smilies
include("bbcodes_smilies.php");

//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("[php ]".$c.$i.$c."[/php ]",$all,$text);
}
}
# PHP-Code-Blöcke umwandeln #

$text = nl2br($text);
// Text zurückgeben
return $text;
}
?>

BNightSpeeder am 22.11.06 16:03

Wo genau soll ich es einbinnden also das ist jetzt kein BBCode wenn du das als BBCode willst würde ich es als RegEx, damit kenne ich mich aber nicht so aus.

fish fish am 22.11.06 23:49

am besten bei der urlerkennung (ab zeile 76) würde ich sagen. oder?

BNightSpeeder am 23.11.06 15:32

Hoffentlich richtig.

<?php
function bbcodes($text, $url = TRUE, $bb = TRUE) {

# 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 = "images/smilies/";

// Header und Footer beschreiben, wie...
// der farbige PHP-Code umschlossen wird
$header_php = '<br/><span class="code_ueberschift">php code</span><span class="code_php"><code>';
$footer_php = '</code></span><br/>';

// Zitate umschlossen werden
$header_quote = '<br/><span class="code_ueberschift">zitat</span><span class="code_php">';
$footer_quote = '</span><br/>';

// normaler code umschlossen wird
$header_code = '<br/><span class="code_ueberschift">code</span><span class="code_code"><code>';
$footer_code = '</code></span><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);

// URLs umformen
if($url) {
//$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,6})"si', 'no_spam', $text);

// Überprüfen
if (strstr($test, "www")){
$ja = "1";
}

if (strstr($test, "http://")){
$ja = "1";
}

if (strstr($test, ".de")){
$ja = "1";
}

if (isset($ja)){

$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].\'[url=\'.$url.\']\'.$m[2].$m[3].\'[/url]\';
}
else return $m[0];'
),
"\n".$text
);
$text = trim($text);
}

}

//Überprüfen Ende

// 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=\"ueberschrift\">\\1\</span><br/>", $text);

//youtube / ect video
$text = preg_replace("/\[video\](.*?)\[\/video\]/si",
"<object type=\"application/x-shockwave-flash\" style=\"width:250px; height:205px\" data=\"\\1\"><param name=\"movie\" value=\"\\1\"></param></object>", $text);

//ueberschrift
$text = preg_replace("/\[h2\](.*?)\[\/h2\]/si",
"<span class=\"unter_ueberschrift\">\\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\" title=\"diesem link folgen\">\\2</a>", $text);
//link mit name
$text = preg_replace("/\[url=(.*?)\](.*?)\[\/url\]/si",
"<a href=\"http://\\1\" title=\"diesem link folgen\">\\2</a>", $text);
//emailadresse
$text = preg_replace("/\[email](\w+?)@(\w+?)\.(\w+?)\](.*?)\[\/email\]/si",
'$4 &lt;$1 bei $2 punkt $3&gt;', $text);

//die smilies
include("bbcodes_smilies.php");

//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("[php ]".$c.$i.$c."[/php ]",$all,$text);
}
}
# PHP-Code-Blöcke umwandeln #

$text = nl2br($text);
// Text zurückgeben
return $text;
}
?>

fish fish am 24.11.06 19:49

hm geht irgentwie nicht

Black am 28.11.06 01:00

Ich wieß nich, obs genau das ist was du jetzt suchst, aber du kannst es ja mal probieren. Das sollte alle links matchen, auch ohne callback..:
$text = preg_replace('/(?:(?:http(s?)\:\/\/)|(www\.))(\S+)/s', '[url=http\\1://\\2\\3]\\0[/url]', $text);

Das \S könntest jetzt natürlich mit deinem regex dafür ersetzen, auf sowas hatt ich jetzt kb :P

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

Impressum & Kontakt