URL nach preg_replace zu lang

StormYus

Mitglied
Ich benutze aus dem PHP FAQ folgenden regulären Ausdruck zum ersetzen von URIs in Texten durch klickbare Links.
Ein Problem dabei sind aber viel zu lange Links, die dann das ganze Layout der Seite sprengen.

Ich suche daher eine Option, die geschriebenen Links nach einer bestimmten Länge abzubrechen. Die URL im href soll dabei natürlich unverändert bleiben.

PHP:
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);
}
 
Du könntest den Pattern-Modifikator e dazu verwenden, eine Callbackfunktion aufzurufen, die das ggf. nötige Kürzen der URI übernimmt:

PHP:
function shorten_uri($str) {
	if (strlen($str) > 40) {
		// String kürzen
	}
	return $str;
}

function replace_uri($str) {
	$pattern = '#(^|[^\"=]{1})(http://|ftp://|mailto:|news:)([^\s<>]+)([\s\n<>]|$)#sme';
	return preg_replace($pattern,"'\\1<a href=\"\\2\\3\"><u>'.shorten_uri('\\2\\3').'</u></a>\\4'",$str);
}
 
Tjor, das scheint mir so aber leider nicht zu gehen :-(

Die strlen ist nämlich einfach 4, der übergibt nicht die bereits geparste URL sondern einfach die //2//3. Also komme ich damit nicht wirklich weiter, wenn ich aus dem RegEx eine Funktion aufrufen könnte, dann wäre ich da ausm Schneider.
 
OK es geht - mein Fehler. Mir sah das mit dem casten des Strings komisch aus und ich dachte da hast du dich vielleicht hier im Forum vertippt.

Aber dein Vorschlag in der Form geht 1zu 1, Problem gelöst.

Danke
 
Also am "schönsten" wäre natürlich ein URL wie

http://www.domain.de/verzeichnis/unterverzeichnis/datei.php?var=bla?nochmehr=blabla

in

http://www.domain.de

So stelle ich mir das zumindest vor... drum frag ich mich ja, wie das mit dem Kürzen funktionieren soll. Denn mit substr() hab ich ja wieder nur eine feste Anzahl von Zeichen zur Verfügung, und es sieht auch doof aus, wenn dort steht: http://www.doma ...und weiter nix.

Außerdem ist das ganze bei mir ein wenig umfangreicher, denn es sollen nicht nur gekürzte Links, sondern auch noch ein paar andere Sachen ersetzt werden:

PHP:
// --- Beispieltext --- //
$text = "Duiß autem vel eum iriure dolor in hendrerit\r in vulputate http://www.velit.net esse molestie consequat, vel illum\rdolore eu feugiat nulla facilisis at vero eros et\r Äccumsan et iusto Ödio dignissim qui blandit praesent\rluptatum http://www.zzril.de/delenit/augue/duis?dolore=te&feugait=nulla facilisi.\r\n\r\n Loräm ipsüm dölör sit amet, consectetuer adipiscing\relit, sed diam nonummy nibh euismod tincidunt ut\rlaoreet \"dolore magna\" aliquam erat volutpat. Ut wisi\renim ad minim veniam, quis nostrud exerci tation\rullamcorper suscipit lobortis nisl Üt aliquip ex €a\rcommodo consequat.";

// --- Funktion Kuerzen --- //
function shorten_uri($text) {
    if (strlen($text) > 20) {
        $text = substr($text, 0, 20)."..."; //   das bringts also mal net ;-)
    }
    return $text;
}

// --- Funktion alles umwandeln --- //
function umwandeln($text) {
	
	// --- 9966-Quotes, Kursiv --- //
    $quotes = '/"(.*)"/U';
    $typo_quotes = '<i>„\1“</i>';
    $text = preg_replace($quotes, $typo_quotes, $text);
    
    // --- Zeilenumbruch --- //
    $text = preg_replace("!(\r\n)|(\r)!","<br>\r\n",$text);

    // --- Links --- //
    $patternurl = '#(^|[^\"=]{1})(http://|ftp://|mailto:|news:)([^\s<>]+)([\s\n<>]|$)#sme';
    $text = preg_replace($patternurl,"'\\1<a href=\"\\2\\3\">".shorten_uri('\\2\\3')."</a>\\4'",$text);

    // --- Umlaute --- //
    $sonderz = array('/ä/', '/ö/', '/ü/', '/Ä/', '/Ö/', '/Ü/', '/ß/', '/€/');
	$html = array("&auml;", "&ouml;", "&uuml;", "&Auml;", "&Ouml;", "&Uuml;", "&szlig;", "&euro;");
	$text = preg_replace($sonderz, $html, $text);
	
    return $text;
}

// --- Ausgabe --- //
echo umwandeln($text);

Und bis auf das abkürzen der URL funktioniert das auch :)

Noch ne kleine Anmerkung: Statt der typographischen Anführungszeichen stehen im Code normalerweise die entsprechenden Werte: & # 1 3 2 ; & # 1 4 7 ; - aber die bekommt die Codeformatierung nicht hin ;-)
 
Zuletzt bearbeitet:
Falls es noch jemand interessiert. Ich habe das ganze so gelöst. (ich habe keine megalangen Texte daher sollte das von der Performance auch kein Problem sein den Text mehrmals durchzugehen)

PHP:
function links_kuerzen($text){  
	preg_match_all("!<a.*?href=\"([^\"]*)\"[^>]*>(.*?)</a>!",$text,$ergebnisse);

	foreach ($ergebnisse[1] as $link){		
		if(strlen($link) > 30){	
		$text = str_replace('<a href="'.$link.'">'.$link.'</a>','<a href="'.$link.'">'.substr($link,0,30).'...</a>', $text);
		}
  	} 
   return $text;
}
 
Zuletzt bearbeitet:
Zurück