• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

RegEx für Linkumwandlung

R

rico2009

Guest
Hi,

ich habe mir vor längerer Zeit einen Reg. Ausdruck für die Linkumwandlung geschrieben, d.h. es werden alle Links (http://...), die man im Textfeld angibt nach <a href="http://forum.jswelt.de/serverseitige-programmierung/...">...</a> umgewandelt. Das geht auch alles super.

Jetzt habe ich leider einen Bug gefunden und zwar wenn ich nach dem Link einen Zeilenumbruch (br) mache und danach Text schreibe, wird auch dieser Text noch als Link interpretiert, dass sollte so ja nicht sein. Ich habe schon einiges probiert, bekomme es aber leider nicht hin. Daher wende ich mich jetzt an euch in der Hoffung das hier einen Experten in Sachen RegEx gibt.

Hier mal ein Beispiel:
aus:
http://www.example.com

Und hier steht dann noch etwas Text
wird:
<a href="http://www.example.com">http://www.example.com <br /><br /> Und hier steht dann noch etwas Text</a>

Mein Ausdruck:
Code:
~(((https?\:\/\/)|(www\.))[^\s]+[^[::punct:]\s]+)~i

Gruß

P.S.: Diese sch*** Smileys, denkt euch den Smiley bitte aus p.
 
Zuletzt bearbeitet von einem Moderator:
Funktioniert bei mir wunderbar:
Code:
<?php
$str = "http://www.example.com

Und hier steht dann noch etwas Text ";

echo preg_replace('~((?:(?:https?\:\/\/)|(?:www\.))[^\s]+[^\.\s]+)~i', "<a href='$1'>$1</a>", $str);
?>
Ausgabe:
Code:
<a href='http://www.example.com'>http://www.example.com</a>

Und hier steht dann noch etwas Text
 
Hi Junkee, hi kkapsner,

einfach ein großes P schreiben und dann ist der Smiley aus, wunderbar, danke für den Tipp.

Wenn ich das INet testen lasse, funktioniert er auch wunderbar, allerdings mache ich bei mir noch folgendes:
Code:
$getan = str_replace(array( '\r\n', '\n', '\r', ), '<br />', $getan);
Ich vermute mal, dass es damit zusammen hängt. Wenn ich das so schreibe wie Junkee sagt, bekomme ich den gleichen Fehler. Das gleiche bei dem Code von kkapsner.
 
Zuletzt bearbeitet:
:D Das war mein erster Gedanke, hat leider nicht funktioniert.

Der Reg. Ausdruck wird über eine Funktion aufgerufen, die in einer anderen Datei liegt. Vielleicht hilft das noch.
 
Wo die Funktion definiert wird, ist völlig egal.

Zeig' doch mal bitte einen minimalen Code, mit dem das Problem reproduziert werden kann.
 
Die Stelle wo die Funktionen aufgerufen werden:
PHP:
...
$getan = str_replace(array( '\r\n', '\n', '\r', ), '<br />', $getan);
$getan = textformatierung($getan);
...

Die Funktion "textformatierung" (bisschen gekürzt):
PHP:
function textformatierung($text) {
$suchmuster = array(...'~(((https?\:\/\/)|(www\.))[^\s]+[^[:punct:]\s]+)~i');
$ersetze = array(...'<a href="$1" target="_blank">$1</a>');
$text = preg_replace($suchmuster,$ersetze,$text);
	
return $text;
}
 
$getan = str_replace(array( '\r\n', '\n', '\r', ), '<br />', $getan);
der teil kann höchstens so funktionieren:
$getan = str_replace(array( "\r\n", "\n", "\r", ), '<br />', $getan);

ich einfachen hochkommas werden \n und \r nicht interpretiert.
Allgemein nimmt man dafür aber einfach http://at2.php.net/manual/de/function.nl2br.php
 
Wenn ich die beiden Zeilen vertausche, komme das bei raus: <a href="http://www.example.com<br /><br />test" target="_blank">http://www.example.com<br /><br />test</a>

@skooli: Mit einfachen Hochkommas klappt die Umwandlung in ein br, mit doppelten nicht.
 
Nach ein wenig trickserei, klappt es jetzt.


Mein Reg. Ausdruck: ~(((https?\:\/\/)|(www\.))[^\s]+[^[:punct:]\s]+[^<br />])~i
 
Das tut aber nicht das, was du willst:
Code:
echo textformatierung("http://hallo.br");
Dein Problem liegt an etwas anderem -> Minimalcode

z.B.
Code:
<?php
function textformatierung($text) {
	$suchmuster = array('~(((https?\:\/\/)|(www\.))[^\s]+[^[:punct:]\s]+)~i');
	$ersetze = array('<a href="$1" target="_blank">$1</a>');
	$text = preg_replace($suchmuster,$ersetze,$text);
	    
	return $text;
}

$txt = "http://hallo.br

test";

$txt = textformatierung($txt);
$txt = str_replace(array('\n', '\r', '\r\n'), "<br />", $txt);
echo $txt;
?>
erzeugt:
Code:
<a href="http://hallo.br" target="_blank">http://hallo.br</a>

test
mit doppelten Anführungszeichen:
Code:
<a href="http://hallo.br" target="_blank">http://hallo.br</a><br /><br /><br /><br />test
 
Hi kkapsner,

eig. tut es genau das was ich will, denn das System wird nur von mir privat / local eingesetzt. Domains mir .br wird es bei mir nicht geben (Das kann ich garantieren). Ansonsten hättest du Recht, dass würde nicht ganz das tun was ich haben will. Deswegen habe ich ja auch "getrickst" geschrieben.

Naja, danke an alle die mir geholfen haben.

Gruß
 
Zuletzt bearbeitet:
Zurück
Oben