webForumDet fria alternativet

modifikation av "länka länkar i sträng"-funktion

PHP

7 svar · 493 visningar · startad av Peeer

Medlem sedan mars 20025 907 inlägg
Frågan#1
function strLinks($text) {
	
	$text = preg_replace('%(<a\s[^>]+>[url]http://[/url][^\s]+</a>)|(<[^>]+[url]http://[/url][^>]+>)|([url]http://[/url])[^\s]+%ie',
		'"$0"=="$1" || "$0"=="$2" ? "$0" : "<a href=\"$0\" rel=\"external\" >$0</a>"', $text);
	$text = preg_replace("/\s([w.-_]+)(@)([w.-_]+)(\.)([w.-_]+)/i", "<a href=\"mailto:$0\">$0</a>",$text);
	$text = preg_replace('%(<a\s[^>]+>[url]http://[/url]|[url]www.[/url][^\s]+</a>)|(<[^>]+[url]www.[/url][^>]+>)|([url]www.[/url])[^\s]+%ie',
                  '"$0"=="$1" || "$0"=="$2" ? "$0" : "<a href=\"http://$0\" rel=\"external\">$0</a>"', $text);	
	return $text;
}

Ovanstående funktion fungerar utmärkt. Den ersätter adresser i strängar med länkar. Nu skulle jag vilja modifiera funktionen så att den fungerar som här på wF. Dvs om länken är längre än X tecken så kortas länken ner. Har gjort diverse försök, men lyckas inte!

ex: http://idg.se/ArticlePages/200409/07/20040907144329_NOK/20040907144329_NOK.dbp.asp

Medlem sedan juni 20006 031 inlägg
#2

Tror att man ska använda funktionen substr().
Men är tyvärr osäker på hur. :l

Medlem sedan mars 20025 907 inlägg
#3

Bump!

Medlem sedan dec. 1999757 inlägg
#4
$url = 'http://www.webforum.nu/showthread.php?threadid=108631&forumid=23';
if (strlen($url) > 55) {
	$short_url = substr($url, 0, 35) . '...' . substr($url, -15);
	print ("<a href=\"" .$url . "\">" . $short_url . "</a>");
} else {
	print ("<a href=\"" .$url . "\">" . $url . "</a>");
}
Medlem sedan mars 20025 907 inlägg
#5

Tack, men nej tack ;)

En funktion för att korta ner urlen ska jag nog klara av, det jag främst behöver hjälp med är att få in anropet till funktionen från min funktion.

function strLinks($text) {
	
	$text = preg_replace('%(<a\s[^>]+>[url]http://[/url][^\s]+</a>)|(<[^>]+[url]http://[/url][^>]+>)|([url]http://[/url])[^\s]+%ie',
		'"$0"=="$1" || "$0"=="$2" ? "$0" : "<a href=\"$0\" rel=\"external\" >[b]min_funktion($0)[/b]</a>"', $text);
	$text = preg_replace("/\s([w.-_]+)(@)([w.-_]+)(\.)([w.-_]+)/i", "<a href=\"mailto:$0\">$0</a>",$text);
	$text = preg_replace('%(<a\s[^>]+>[url]http://[/url]|[url]www.[/url][^\s]+</a>)|(<[^>]+[url]www.[/url][^>]+>)|([url]www.[/url])[^\s]+%ie',
                  '"$0"=="$1" || "$0"=="$2" ? "$0" : "<a href=\"http://$0\" rel=\"external\">[b]min_funktion($0)[/b]</a>"', $text);	
	return $text;
}

Jag vet att det ska gå att göra något liknande, men det vill sig inte riktigt. Istället för att anropa min_funktion() så skriver den helt enkelt ut texten min_funktion(). :/

Medlem sedan juli 2000297 inlägg
#6

Sätt ' . min_funktion($0); . '

Medlem sedan mars 20025 907 inlägg
#7

Gick inte det heller tyvärr. Jag har dock kommit lite närmare en lösning nu

function strLinks($text) {
	
	$text = preg_replace('%(<a\s[^>]+>[url]http://[/url][^\s]+</a> )|(<[^>]+[url]http://[/url][^>]+> )|([url]http://[/url])[^\s]+%ie',
		'"$0"=="$1" || "$0"=="$2" ? "$0" : "<a href=\"$0\" rel=\"external\" >$0</a>"', $text);
	$text = preg_replace("/\s([w.-_]+)(@)([w.-_]+)(\.)([w.-_]+)/i", "<a href=\"mailto:$0\">$0</a>",$text);
	$text = preg_replace('%(<a\s[^>]+>[url]http://[/url]|[url]www.[/url][^\s]+</a> )|(<[^>]+[url]www.[/url][^>]+> )|([url]www.[/url])[^\s]+%ie',
                  '"$0"=="$1" || "$0"=="$2" ? "$0" : "<a href=\"http://$0\" rel=\"external\">[b]".min_funktion($0)."[/b]</a>"', $text);	
	return $text;
}
function min_funktion($data){
	if(strlen($data) > 35)
		return substr($data,0,25) . '...' . substr($data,-10);
	else
		return $data;
}

echo strLinks('foo [url]www.verylongdomainname.se[/url] bar');

Resulterar i

foo <a href="http://www.verylongdomainname.se" rel="external">wwwverylongdomainnamese</a> bar

dvs, någon snor alla punkter i adressen! Vart sjutton försvinner dem? :q

/r Hmm, min debugger skriver ut små kryptiska felmeddelanden.

Debug session started.
Notice: PHPDocument1(8) : regexp code line 1 - Use of undefined constant www - assumed 'www'
Notice: PHPDocument1(8) : regexp code line 1 - Use of undefined constant verylongdomainname - assumed 'verylongdomainname'
Notice: PHPDocument1(8) : regexp code line 1 - Use of undefined constant se - assumed 'se'
Debug session ended.

Tolka någon?

Medlem sedan juli 2000297 inlägg
#8

Matchar inte den sista preg_replace utdata från min_funktion då? Blir helt blind av regexpen.

263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)