URLs nur in bestimmten Fällen in anklickbare Links umwandeln (preg_replace)

mr_brusthaar

Grünschnabel
Hallo!

Also... folgende Funktion tut ihren Dienst ganz gut:
PHP:
$text = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<A TARGET=\"_blank\" HREF=\"$1\">$1</A>", $text);
(wandelt URLs aus einem String in anklickbare Links um)

Aber: Ich habe im Text zum Beispiel auch schon Bilder drin, also Dinge wie <img src="http://www.domain.de/bild.jpg"> ... nun soll er natürlich diesen link NICHT umwandeln ... ich habe nun schon 2 Nächte damit verbracht, das Problem mit regulären Ausdrücken zu lösen, aber komme nicht weiter.

Könnte man denn irgendwie angeben, dass, wenn ein = oder ein =" vor http steht, dass dann die umwandlung nicht geschieht?

lieben Gruß
 
PHP:
function make_clickable($ret) {
$ret = ' ' . $ret . ' ';
$ret = preg_replace("#([\s\n>])(https?|ftp)://([^\s<>{}()]+[^\s.,<>{}()])#i", "$1<a href='$2://$3' rel='nofollow'>$2://$3</a>", $ret);
$ret = preg_replace("#([\s\n>])(www|ftp)\.([a-z0-9\-]+)\.([a-z0-9\-.\~]+)((?:/[^ <>{}()\n\r]*[^., <>{}()\n\r]?)?)#i", "$1<a href='http://$2.$3.$4$5' rel='nofollow'>$2.$3.$4$5</a>", $ret);
$ret = preg_replace("#([\s\n>])([a-z0-9\-_.]+)@([a-z0-9\-_.]+)\.([^,< \n\r]+)#i", "$1<a href=\"mailto:$2@$3.$4\">$2@$3.$4</a>", $ret);
$ret = preg_replace("#(<a [^>]+?>)<a [^>]+?>([^>]+?)</a></a>#i", "$1$2</a>", $ret);
$ret = trim($ret);
return $ret;
}
Kommt so oder so ähnlich in WordPress vor.
 
hmz verdammt, diese funktion hatte ich schon gesehen beim durchsuchen des forums, aber hab nicht gesehen, dass sie das kann was ich meine :) danke dir vielmals! klappt einwandfrei!
 
Hi!

Hab dein Script gefunden, und ich finds super! Ich arbeit jetzt schon länger an sowas, und das hilft mir echt weiter. Ich würde das Script gerne erweitern, indem ich ab einer bestimmten Zeichenlänge (z.B. 20 Zeichen) die URL automatisch gekürzt werden soll.

Ich würde gerne innerhalb des preg_replace folgende Funktion aufrufen:
PHP:
function trimLinks($url) {
	$shorturl = $url;
	if(strlen($url)>20) {
		$shorturl = substr($url, 0, 20)."...";
	}
	return $shorturl;
}

Hat jemand eine Ahnung, ob das funktionieren kann?
Ich hab das Problem, dass wenn ich die Funktion trimLinks() einfach so integriere...
PHP:
	$ret = preg_replace("#([\s\n>])(www|ftp)\.([a-z0-9\-]+)\.([a-z0-9\-.\~]+)((?:/[^ <>{}()\n\r]*[^., <>{}()\n\r]?)?)#i", "$1<a href='http://$2.$3.$4$5' rel='nofollow'>".trimLinks("$2.$3.$4$5")."</a>", $ret);
... als Werte lediglich "$2.$3.$4$5" übergeben werden, und nicht die Url.

Grüße,
debugger
 
PHP:
$ret = preg_replace('#([\s\n>])((?:www|ftp)\.[a-z0-9\-]+\.[a-z0-9\-.\~]+(?:/[^ <>{}()\n\r]*[^., <>{}()\n\r]?)?)#ei', '"$1<a href=\"http://$2\" rel=\"nofollow\">".trimLinks("$2")."</a>"', $ret);
 
Danke! Perfekt :)

Hier alles zusammen:
PHP:
function trimLinks($url) {
	$shorturl = $url;
	if(strlen($url)>30) {
		$shorturl = substr($url, 0, 30)."...";
	}
	return $shorturl;
}

function make_clickable($ret) {
	$ret = ' ' . $ret . ' ';
	$ret = preg_replace('#([\s\n>])(https?|ftp)://([^\s<>{}()]+[^\s.,<>{}()])#ei', '"$1<a href=\"$2://$3\" rel=\"nofollow\">".trimLinks("$2://$3")."</a>"', $ret);
	$ret = preg_replace('#([\s\n>])(www|ftp)\.([a-z0-9\-]+)\.([a-z0-9\-.\~]+)((?:/[^ <>{}()\n\r]*[^., <>{}()\n\r]?)?)#ei', '"$1<a href=\"http://$2.$3.$4$5\" rel=\"nofollow\">".trimLinks("$2.$3.$4$5")."</a>"', $ret);
	$ret = preg_replace("#([\s\n>])([a-z0-9\-_.]+)@([a-z0-9\-_.]+)\.([^,< \n\r]+)#i", "$1<a href=\"mailto:$2@$3.$4\">$2@$3.$4</a>", $ret);
	$ret = preg_replace("#(<a [^>]+?>)<a [^>]+?>([^>]+?)</a></a>#i", "$1$2</a>", $ret);
	$ret = trim($ret);
	return $ret;
}

echo make_clickable("Bisschen Text http://www.heise.de/newsticker/foren/S-Wem-ist-auch-aufgefallen/forum-135972/msg-14775905/read/<br /> dazwischen wieder ein weiterer text eine.email@domain.com und noch wein wenig Text");
 
Zurück