webForumDet fria alternativet

Sökes: Den ultimata hyperlänkarfunktionen!

PHP

5 svar · 341 visningar · startad av Mungo

Medlem sedan jan. 2000372 inlägg
Frågan#1

Man blir ju galen... Så länge jag har hållit på med PHP har jag sökt med ljus och lykta efter den ultimata "hitta länkar i text"-funktionen. Jag har hittat en som funkar helt OK, nämligen:

function strLinks($text) {
    $text = preg_replace("/((http(s?):\/\/)|(www\.))([\w\.:!?~=&\-_\/]+)/i","<a href=\"http$3://$4$5\" target=\"_blank\"><u>$2$4$5</u></a>",$text); 
    $text = preg_replace("/([w.-_]+)(@)([w.-_]+)/i", "<a href=\"mailto:$0\"><u>$0</u></a>",$text);
    return $text;
	}

Men den har två irriterande buggar:

1. Om texten som genomsöks _börjar_ med en URL funkar det inte.
2. Om texten redan innehåller hyperlänkar I HTML-format blir det galet.

Man skulle alltså vilja justera ovanstående funktion så att den dels kan hitta länkar oavsett var i strängen de befinner sig, samt att den ska ignorera sånt som står inom <a>-länkar och det som står mellan <a href=... och </a>.

Är det nån som har lust och ork att hjälpa till här? Jag tror inte att jag är den ende som har behov av den här funktionen, och om vi kan få fram en som funkar 100% kan vi ju lägga in den i wF-kod sen så har vi den för alla framtida behov! :)

//Måns

Medlem sedan jan. 2000372 inlägg
#2

Jaha, efter att ha fått hjälp i ett annat forum tror jag mig besitta den Ultimata Stränlänkarfunktionen ™ !

Här är den:

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 target=\"_blank\" href=\"$0\">$0</a>"', $text);
	$text = preg_replace("/([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 target=\"_blank\" href=\"http://$0\">$0</a>"', $text);	
	return $text;
	}

Denna tar in en sträng, hittar allt som börjar med "http://" eller "www." eller är en giltig e-postadress och länkar upp det. Men den struntar i det som ligger inom HTML-taggar eller inom <a></a>.

Medlem sedan juli 2001711 inlägg
#3

om länken börjar med "https://" då? :q

Medlem sedan jan. 2000372 inlägg
#4

Det har du rätt i, men det har jag aldrig haft behov av. Borde dock bara vara att lägga till |https:// på rätt ställen i regexpet.

Medlem sedan jan. 2002341 inlägg
#5

kolla efter

urlencode()

.. fast jag kanske är helt ute och cyklar.

Medlem sedan jan. 2000372 inlägg
#6

Jo, det är du nog. :)

Den här funktionen skapar HTML-hyperlänkar från en vanlig textsträng.

270 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)