Hi,
Gib halt nicht die gesamte URL als klickbaren Text an, sondern nur die ersten 30 Zeichen oder so (ggf. noch mit ...)
Könntest du mit eventuell eine Seite zeigen aus welcher ich lernen kann damit umzugehen? Ich kapiere von der Funktion nichts. Und beschrieben ist auch nichts. Außerdem suche ich anscheinend mit den falschen suchwörtern nach einer Lösung meines Problemes.
Deine jetzige Funktion:
function replace_uri($str) {
$pattern = '#(^|[^"=]{1})(http://|ftp://|mailto:|news:)([^\s<>]+)([\s\n<>]|$)#sm';
return preg_replace($pattern,"\1<a href="\2\3"><u>\2\3</u></a>\4",$str);
}
$pattern = '#(^|[^"=]{1})(http://|ftp://|mailto:|news:)([^\s<>]+)([\s\n<>]|$)#sm';
dient als Trennzeichen des Regulären Ausdrucks, sowohl am Anfang als auch am Ende, ganz am Ende noch die Optionen zum Pattern.
Dazwischen (zwischen den beiden ##) kommen die verschiedenen Teile (geklammert):
1: (^|[^"=]{1})
Stringanfang oder ein von " und = verschiedenes Zeichen
2: (http://|ftp://|mailto:|news:)
Das Protokoll der URL (das würde ich noch um https:// ergänzen zu (http://|ftp://|mailto:|news:|https://)
3: ([^\s<>]+)
beliebig viele Zeichen, die aber weder Space noch < noch > sind - die URL mit Ausnahme des Protokolls
4: ([\s\n<>]|$)
ein Space oder Zeilenende oder < oder > oder das Stringende.
Diese durchnumerierten Teile werden beim replace wieder eingesetzt, siehe die \ gefolgt von Nummern (der doppelte \ ist notwendig, weil ein \ ja von PHP als Escape-Zeichen verwendet wird).
Du willst jetzt den 3. Teil in 2 Teile aufspalten: zuerst bis zu 30 Zeichen, die Du für den klickbaren Text benutzt, danach der Rest der URL.
Da das ein Teil mehr ist, bekommt der bisherige Teil 4 die neue Nummer 5
3 neu: ([^\s<>]{1,30})
maximal 30 Zeichen der URL
4 neu: ([^\s<>]*)
die restlichen Zeichen der URL, falls vorhanden
5 neu = 4 alt: ([\s\n<>]|$)
ein Space oder Zeilenende oder < oder > oder das Stringende.
Zusammengesetzt also
$pattern = '#(^|[^"=]{1})(http://|ftp://|mailto:|news:|https://)([^\s<>]{1,30})([\s\n<>]|$)([\s\n<>]|$)#sm';
In der replace-Anweisung
return preg_replace($pattern,"\1<a href="\2\3"><u>\2\3</u></a>\4",$str);
muß natürlich jetzt berücksichtigt werden, daß der alte Teil 3 aufgesplittet wurde und der bisherige 4. Teil jetzt Teil 5 ist.
return preg_replace($pattern,"\1<a href="\2\3\4"><u>\2\3...</u></a>\5",$str);
Im href müssen jetzt die Teile 2, 3 und 4 stehen, denn diese bilden die URL.
Im Link drin stehen die Teile 2 (Protokoll) und 3 (erste 30 Zeichen der URL) sowie 3 Punkte (die erscheinen immer, auch wenn die URL kürzer ist - kannst Du auch einfach weglassen - da fällt mir im Moment keine Möglichkeit ein, die nur dann einzubinden, wenn Teil 4 nichtleer ist)
Nach dem Link steht jetzt Teil 5 statt Teil 4 (weil durch die Aufteilung der URL sich die Numerierung verschiebt.
Ich würde dann noch das u-Element rausschmeißen - dafür gibt es ja CSS, um den Link zu unterstreichen:
$pattern = '#(^|[^"=]{1})(http://|ftp://|mailto:|news:|https://)([^\s<>]{1,30})([\s\n<>]|$)([\s\n<>]|$)#sm';
return preg_replace($pattern,"\1<a href="\2\3\4">\2\3</a>\5",$str);
cu,
Andreas
MudGuard? Siehe http://www.Mud-Guard.de/
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.