webForumDet fria alternativet

Förkorta url

5 svar · 598 visningar · startad av WiZzLeR

WiZzLeRMedlem sedan juni 2002346 inlägg
#1

jag använder denna funktion för att göra hyperlänkar automatiskt.

function auto_link($string)
{
	$string = preg_replace("/(?<=^|\s)(www\.([-a-zA-Z0-9_]+\.)*[-a-zA-Z0-9_]+\.[-a-zA-Z0-9_])/", "http://$1", $string);
	$search = "/(?<=^|\s)(http:\/\/|https:\/\/|ftp:\/\/)(([-a-zA-Z0-9_]+\.)*[-a-zA-Z0-9_]+\.[-a-zA-Z0-9_]{2,8}[^\s]*)(?=\s|$)/";
	$replace = "<a href=\"$1$2\">$2</a>"; 
	$string = preg_replace($search, $replace, $string);
	
return $string;
}

Hur kan jag förkorta urlen som här på webforum: http://www.bla/.../lasld.com

har försökt med substr men då förkortas hela strängen. =/

nicclasMedlem sedan feb. 20001 050 inlägg
#2

Din regular expression för att identifiera en URL är rätt komplicerad. Med en så komplicerad reg. exp. blir det (nästintill?) omöjligt ta reda på hur lång en URL i texten är. Jag har därför skippat kravet att en URL måste innehålla minst en punkt, som du hade tidigare.

Provkör detta:

<?php
function auto_link($string)
{

  $string = preg_replace("/(?<=^|\s)(www\.([-a-zA-Z0-9_]+\.)*[-a-zA-Z0-9_]+\.[-a-zA-Z0-9_])/", "http://$1", $string);

  $search = "/(?<=^|\s)(http:\/\/|https:\/\/|ftp:\/\/)(\S{21,})(?=\s|$)/e"; 
  $replace = "'<a href=\"$1$2\">$1'.substr('$2',0,10).'...'.substr('$2',-10).'</a>'"; 
  $string = preg_replace($search, $replace, $string);

  $search = "/(?<=^|\s)(http:\/\/|https:\/\/|ftp:\/\/)(\S{1,20})(?=\s|$)/";
  $replace = "<a href=\"$1$2\">$1$2</a>";
  $string = preg_replace($search, $replace, $string);

  return $string;
}

$text="En lank [url]http://www.frisim.com/[/url] dar du far ersatta frisim med nagot langre for att testa...";
echo auto_link($text);

?>

Du får själv testköra för att förvissa dig om att det verkligen fungerar som du vill...

WiZzLeRMedlem sedan juni 2002346 inlägg
#3

Ja det fungerar =)

nicclasMedlem sedan feb. 20001 050 inlägg
#4

Efter lite funderande kom jag fram till att det är så här det ska göras. Med denna kod får du med ditt "krav" på att endast URL:ar med minst en punkt i kommer igenom.

Eftersom du med denna kod "slipper" en av preg_replace-anropen kanske den är lite snabbare också...

<?php
function shorten($url){
  if(strlen($url)>20)
    return substr($url,0,10)."...".substr($url,-10);
  return $url;
}

function auto_link($string)
{

  $string = preg_replace("/(?<=^|\s)(www\.([-a-zA-Z0-9_]+\.)*[-a-zA-Z0-9_]+\.[-a-zA-Z0-9_])/", "http://$1", $string);

  $search = "/(?<=^|\s)(http:\/\/|https:\/\/|ftp:\/\/)(([-a-zA-Z0-9_]+\.)*[-a-zA-Z0-9_]+\.[-a-zA-Z0-9_]{2,8}[^\s]*)(?=\s|$)/e";
  $replace = "'<a href=\"$1$2\">$1'.shorten('$2').'</a>'"; 
  $string = preg_replace($search, $replace, $string);
  
  return $string;
}

$text="En lank dar lank [url]http://www.fr123123123123123123123123123123isim.com/[/url] frisim ersatts med nagot langre for att testa...";
echo auto_link($text);
?>

(Innan jag tittade på denna fråga hade jag ingen aning om att man kunde anropa en "function" direkt inne i en regular expression i PHP. Det gör ju reg. exp:s i PHP ännu flexiblare, och kanske till och med enklare att använda :) )

WiZzLeRMedlem sedan juni 2002346 inlägg
#5

hmm nått är fel. Den hittar inte urler. Troligtvis något fel i $search. Ska kolla.

nicclasMedlem sedan feb. 20001 050 inlägg
#6

Det verkar konstig om mitt första, men inte andra exempel fungerar eftersom det har samma reg.exp. som i ditt ursprungliga förslag. Det enda som skiljer är /e på slutet, och det bör inte påverka vilka textdelar som hittas.

Båda mina exempel fungerar på alla de varianter av test-strängar jag provat.

130 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)