Wörter die lange sind trennen, nicht aber Links

aargau

Erfahrenes Mitglied
Damit das Design nicht "Kaput" geht möchte ich lange Wörter nach ca 30 Zeichen trennen. Jedoch sollten Links nicht getrennt werden, oder nur bei der ansicht, nicht jedoch der Link selbst. Gibt es da irgend eine möglichkeit? Links müssen natürlich anklickbar sein.

Ich hoffe jemand kann mir da helfen. Ich hab es zwar geschaft ein String nach X Zeichen zu trennen, nicht jedoch nur wörter, und schon gar nicht so das dies bei Links nicht der fall ist.
 
Erster Schritt: wie lang ist ein String/Wort?
Zweiter Schritt: sobald diese Länge erreicht, Wort trennen. Am besten schreibst du dir hierzu eine Methode, die per Regex oder so das betroffene Wort trennt. Und zwar solltest du hierbei nach Vokalen und Konsonanten suchen
Jedenfalls ist die Worttrennung hier ja recht einfach. Such im Bereich der Mitte des Wortes nach einer Möglichkeit zu trennen und füge dann ein - und ein <br> ein. Vll gibt es ja auch ne fertige Methode, die ist mir nur leider nicht bekannt.
 
ist zwar schon lange her aber ich komme nicht mehr weiter...
Ich habe mir mal eine kleine Funktion geschrieben welche wörter nach einem abstand in ein array wirft und danach untersucht wird ob es sich um ein link handelt und dementsprechend nicht geändert wird...

Nun läuft das auch ganz gut wenn ich von hand ein String eingebe und diesen via echo ausgebe, wenn ich allerdings Daten aus der Datenbank verwende geht das ganze irgend wie nicht... Ich hoffe mir kann jemand helfen!

Die Funktion ist noch nicht fertig, soll noch um Quotes, Smileys etc erweitert werden, aber bevor ich dies mache muss ich sichergehen das es überhaupt klappt.


PHP:
function tURL($url) {
$shorturl = $url;
 if(strlen($url)>30) {
$shorturl = substr($url, 0, 30)."...";
}
return "<A HREF=\"$url\">$shorturl</A>";
} 



function text($string) 
{
// XSS schutz, HTML verbieten
$string = htmlentities($string) ; 
// nach wörter Trennen
$exp = explode(" ",$string) ; 
foreach($exp as $n)
	{
if(substr($n,0,7) == "http://" OR substr($n,0,4)=="www.")
{
	$out=$out.$n." ";
} else {
$out=$out.wordwrap($n, 30, " ", 1)." ";
}}
// Links die mit http:// oder www. beginnen kürzen, "link" allerdings bestehen lassen
$out = preg_replace('/(?:(?:f|ht)tp:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/=]+/e', 'tURL("\\0")',$out); 
$out = preg_replace('/www\.[-a-zA-Z0-9@:%_\+.~#?&\/=]+/e','tURL("http://\\0")', $out); 
// störende / vor " entfernen
$out= stripcslashes($out) ; 

// Umbrüche von Formularen wiederherstellen
$out = nl2br($out) ;

// Smileys, Quotes etc hier einfuegen


return $out ; 
}


ein
PHP:
<?php echo text("hallo das ist ein laaaaaaaaaaaaaaaaanges Wort und noch ein http://www.laaaaaaaaaaanger.com/link/mit/vielen/extras") ;
geht Problemlos... auch wenn ich via $_GET[] was übernehme geht es Problemlos... Bei der Datenbank hingengen nicht.

Edit:
Problem ist nur dann, wenn der Link auf einer neuen Zeile steht, da da wie es aussieht kein leerzeichen davor ist und er daher nicht erkannt wird... Nun weis ich nicht wie ich dies am besten löse damit dies trozdem geht
 
Zuletzt bearbeitet:
Habe nun eine Lösung gefunden.. ich trenne zeurst nach den unterbrüchen, füge jeweils vor und nach dem unterbruch ein leerzeichen hinzu, trenne dann nach den leerzeichen ab und den rest wie bisher...
Allerdings denke ich das es da vieleicht eine etwas lastsparendere Lösung gibt, sollte dies so sein würde ich mich freuen, wenn jemand die Funktion so abändern würde...

PHP:
function text($string) 
{
// XSS schutz, HTML verbieten
$string = htmlentities($string) ; 
// nach wörter Trennen


foreach(explode("
",$string) as $new)
	{
$o=$o." ".$new."
";

	}
foreach(explode(" ",$o) as $n)
	{
if(substr($n,0,7) == "http://" OR substr($n,0,4)=="www.")
{
	$out=$out.$n." ";
} else {
$out=$out.wordwrap($n, 30, " ", 1)." ";
}}

// Links die mit http:// oder www. beginnen kürzen, "link" allerdings bestehen lassen
$out = preg_replace('/(?:(?:f|ht)tp:\/\/)[-a-zA-Z0-9@:%_\+.~#?&\/=]+/e', 'tURL("\\0")',$out); 
$out = preg_replace('/www\.[-a-zA-Z0-9@:%_\+.~#?&\/=]+/e','tURL("http://\\0")', $out); 
// störende / vor " entfernen
$out= stripcslashes($out) ; 

// Umbrüche von Formularen wiederherstellen
$out = nl2br($out) ;

// Smileys, Quotes etc hier einfuegen


return $out; 
}

Nun was mir noch auffällt, eigentlich könnte man ja jetzt sogar das preg_replace() weglassen und einfach oben bei
PHP:
if(substr($n,0,7) == "http://" OR substr($n,0,4)=="www.")
direkt ein Link Setzen. Empfehlenswert?
 
Zurück