"Leonard" <usenet@leonard.dk> skrev i en meddelelse
news:4a7nm1t8ibj2bovejv7tpeg4t37jlvr3o6@4ax.com...
> Problemet er at
http://www.leonard.dk bliver fanget 2 gange og så ser
> det skørt ud. Jeg kan ikke regne ud hvordan jeg kan ændre det til at
> fange både
http://leonard.dk og
www.leonard.dk uden at lave ged i
>
http://www.leonard.dk
Jeg har selv skrevet, og bruger selv, dette script til at omskrive links.
Det er dog delvist PHP/regex.
Scriptet fanger alle links og afkorter dem hvis de er for lange (så de ikke
ødelægger mit grafiske design). Den prøver desuden at lægge mærke til om det
står i parantes eller i slutningen af en sætning (så et punktum, komme eller
slutparantes ikke tages med).
Scriptet ser således ud:
<?
function links_parse($besked, $maxlength = false){
$signs[] = ".";
$signs[] = ")";
$signs[] = ",";
if
(preg_match_all("/(www\.|http:\/\/|ftp:\/\/)(www\.|)([\w-]*)[\.]([\w]{2,3})?[\S-]*[a-zA-Z0-9]/",
$besked, $matches)){
foreach($matches[0] AS $key => $match){
if (strtolower($matches[1][$key]) == "
www."){
$in_link = "http://" . $match;
}else{
$in_link = $match;
}
$lastsign = substr($in_link, -1, 1);
foreach($signs AS $sign){
if ($lastsign == $sign){
$forsign = true;
$forsign_sign = $lastsign;
$in_link = substr($in_link, 0, -1);
}
}
if ($maxlength && strlen($match) > $maxlength){
$in_title = $match;
$in_title = substr($in_title, 0, ($maxlength - 2)) . "...";
$in_return = "<a target=\"_blank\" href=\"" . $in_link . "\">" .
$in_title . "</a>";
}else{
if ($forsign == true){
$in_title = substr($match, 0, -1);
}else{
$in_title = $match;
}
$in_return = "<a target=\"_blank\" href=\"" . $in_link . "\">" .
$in_title . "</a>";
if ($forsign == true){
$in_return .= $forsign_sign;
}
}
$replaces[$match] = $in_return;
}
$besked = strtr($besked, $replaces);
}
return $besked;
}
?>
Løsningen i regex ville være at lave en mulighed for ingenting, eller
"http://" foran.
Altså:
(|http://)
Læg mærke til "|" som betyder "eller". Det vil sige på den ene side er den
ene mulighed (i dette tilfælde ingenting) og på den anden side er "
http://".
Så vil dit regex også fange "
http://".
--
Mvh Kasper Johansen