WiZzLeRMedlem sedan juni 2002346 inlägg 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 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...
nicclasMedlem sedan feb. 20001 050 inlägg 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 hmm nått är fel. Den hittar inte urler. Troligtvis något fel i $search. Ska kolla.
nicclasMedlem sedan feb. 20001 050 inlägg 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.