Avatar billede cht22 Professor
04. november 2013 - 10:47 Der er 5 kommentarer og
1 løsning

Få lavet URLs om til links

Jeg mangler et script der kan lave URLS om til links i en tekst.

Jeg har fundet følgende på nettet som virker meget godt. Jeg kunne bare godt tænke mig at det kunne lidt mere og jeg forstår ikke helt hvad det er preg_replace gør, ud over at det ser ud til at det virker:

function makeClickableLinks($s) {
  return preg_replace('@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', '<a href="$1" target="_blank">$1</a>', $s);
}

Jeg kunne godt tænke mig at links hvor der er skrevet www. uden at skrive http:// foran også bliver til links og også gerne hvis der er skrevet URLs uden nogen af delene for eksempel dr.dk.

Jeg har fundet nogen på nettet der skulle kunne, men dem jeg har fundet indeholder fejl. Dvs. hvis der for eksempel linjeskift efter linket i stedet for mellemrum, så virker det ikke.

Der er masser at finde hvis man søger på nettet efter: "php make urls into links" men desværre har jeg ikke kunne finde noget der virker helt som jeg gerne vil have det skal.

Hvordan laver man eventuelt sådan noget selv?
Avatar billede cht22 Professor
04. november 2013 - 18:47 #1
Jeg har lavet følgende kode, som kan finde første adresse og lave det om til et link. Jeg kan ikke finde ud af hvordan jeg får den til at finde resten af adresserne og måske også noget lidt pænere kode.



<?php
$text = "Det her er en URL http://www.dr.dk/Nyheder/Politik/2013/11/04/140341.htm.\n<b>skal</b>\ntestes. Her er endnu et link www.tv2.dk. Det samme link igen: http://www.dr.dk/Nyheder/Politik/2013/11/04/140341.htm. Der kan være denne adresse ftp://www.servernavn-adresse.dk/filnavn.pdf Der kan også være http://www.dr.dk/tv/ eller http://dr.dk ";

function text_find($strText,$strFind) {
// ### Finder ud af om tekst indeholder bestemt streng ###

$varpos = strpos("$strText","$strFind");

if (!$varpos && substr($strText,0,strlen("$strFind")) != "$strFind") {
return FALSE;
}
else {
return TRUE;
}
}

function IntoLinks($s) {

// ### Denne funktion finder kun første link!

// ### Adresser der starter med følgende
// ### bliver lavet om til links:
//
// www.
// http://
// https://
// ftp://

// Der er fjernelse af punktum hvis der står det i enden af adresse.

$vartemp = "";

$varpos = strpos($s,"www.");

$textbefore = substr($s,0,$varpos);

$textafter = substr($s,$varpos);

$endpos1 = strpos($textafter," ");
$endpos2 = strpos($textafter,"\r\n");
$endpos3 = strpos($textafter,"\n");
$endpos4 = strpos($textafter,"<");
$endpos5 = strpos($textafter,">");
$endpos6 = strpos($textafter,"&lt;");
$endpos7 = strpos($textafter,"&gt;");

$endpos = $endpos1;

if ($endpos2 !== FALSE) {
if ($endpos === FALSE || $endpos2 < $endpos)
$endpos = $endpos2;
}

if ($endpos3 !== FALSE) {
if ($endpos === FALSE || $endpos3 < $endpos)
$endpos = $endpos3;
}

if ($endpos4 !== FALSE) {
if ($endpos === FALSE || $endpos4 < $endpos)
$endpos = $endpos4;
}

if ($endpos5 !== FALSE) {
if ($endpos === FALSE || $endpos5 < $endpos)
$endpos = $endpos5;
}

if ($endpos6 !== FALSE) {
if ($endpos === FALSE || $endpos6 < $endpos)
$endpos = $endpos6;
}

if ($endpos7 !== FALSE) {
if ($endpos === FALSE || $endpos7 < $endpos)
$endpos = $endpos7;
}

if ($endpos !== FALSE) {
if (substr($textbefore,-7) == "http://" || substr($textbefore,-8) == "https://" || substr($textbefore,-6) == "ftp://") {
$textbefore = substr($s,0,$varpos-7);
$textafter = "http://".substr($s,$varpos);
$endpos = $endpos+7;
if (substr(substr($textafter,0,$endpos),-1) == ".") {
$endpos = $endpos-1;
}
$link = "<a href=\"".substr($textafter,0,$endpos)."\">".substr($textafter,0,$endpos)."</a>";
}
else {
if (substr(substr($textafter,0,$endpos),-1) == ".") {
$endpos = $endpos-1;
}
$link = "<a href=\"http://".substr($textafter,0,$endpos)."\">".substr($textafter,0,$endpos)."</a>";
}
$textafter = substr($textafter,$endpos);
if (text_find($textafter,"www.") || text_find($textafter,"http://") || text_find($textafter,"https://")) {
// !!! mangler resten af adresserne
$vartemp = $textbefore . $link . ($textafter);
}
else {
$vartemp = $textbefore . $link . $textafter;
}
}
else {
if (substr($textbefore,-7) == "http://" || substr($textbefore,-8) == "https://" || substr($textbefore,-6) == "ftp://") {
if (substr($textbefore,-7) == "http://") {
$link = "<a href=\"".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
}
else {
// !!! mangler https:// og ftp://
$link = substr($textafter,0);
}
}
else {
$link = "<a href=\"http://".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
}
$textafter = substr($textafter,$endpos);
$vartemp = $textbefore . $link;
}

  return $vartemp;
}

function htmlencode($str_text) {
  $tmp_text = str_replace("<", "&lt;", "$str_text");
  $tmp_text = str_replace(">", "&gt;", "$tmp_text");
  return $tmp_text;
}

echo IntoLinks(htmlencode($text));
?>

Avatar billede cht22 Professor
04. november 2013 - 22:23 #2
Nu er jeg kommet lidt længere. Det ser dog ud til at der er fejl, fordi det er ikke alle adresser der bliver lavet om. Er der en der kan se fejlen?



<?php
$text = "Det her er en URL http://www.dr.dk/Nyheder/Politik/2013/11/04/140341.htm.<b>skal</b> testes. Her er endnu et link www.tv2.dk. Det samme link igen: http://www.dr.dk/Nyheder/Politik/2013/11/04/140341.htm. Der kan være denne adresse ftp://www.servernavn-adresse.dk/filnavn.pdf Der kan også være http://www.dr.dk/tv/ eller http://dr.dk\nftp://192.168.0.1. Der kan også være http://192.168.0.1/ https://192.168.0.1/ www.dr.dk man kan godt skrive www og www. eller ftp:// http://dr.dk det er det sidste link.";

//$text = "http://dr.dk\r\n";
//$text = "http://dr.dk";

function text_pos($strText,$strFind) {
  $varpos = strpos("$strText","$strFind");
  if (substr($strText,0,strlen("$strFind")) == "$strFind") {
      $varpos = 0;
  }
  return $varpos;
}

function text_find($strText,$strFind) {
// ### Finder ud af om tekst indeholder bestemt streng ###
  $varpos = text_pos("$strText","$strFind");
  if (!$varpos && substr($strText,0,strlen("$strFind")) != "$strFind") {
      return FALSE;
  }
  else {
      return TRUE;
  }
}

function IntoLinks($s) {

// ### Denne funktion finder kun første link!

// ### Adresser der starter med følgende
// ### bliver lavet om til links:
//
// www.
// http://
// https://
// ftp://

// Der er fjernelse af punktum hvis der står det i enden af adresse.

$vartemp = "";

$found_more_links = TRUE;
$counter = 0;

while ($found_more_links) {

$varpos = text_pos($s,"www.");

if (text_pos($s,"http://") > 0 && (text_pos($s,"http://") < $varpos || $varpos == 0))
$varpos = text_pos($s,"http://");
else if (text_pos($s,"https://") > 0 && (text_pos($s,"https://") < $varpos || $varpos == 0))
$varpos = text_pos($s,"https://");
else if (text_pos($s,"ftp://") > 0 && (text_pos($s,"ftp://") < $varpos || $varpos == 0))
$varpos = text_pos($s,"ftp://");

$textbefore = substr($s,0,$varpos);

$textafter = substr($s,$varpos);

$endpos1 = text_pos($textafter," ");
$endpos2 = text_pos($textafter,"\r\n");
$endpos3 = text_pos($textafter,"\n");
$endpos4 = text_pos($textafter,"<");
$endpos5 = text_pos($textafter,">");
$endpos6 = text_pos($textafter,"<");
$endpos7 = text_pos($textafter,">");

$endpos = $endpos1;

if ($endpos2 !== FALSE) {
  if ($endpos2 !== FALSE && ($endpos === FALSE || $endpos2 < $endpos)) {
      $endpos = $endpos2;
  }
}

if ($endpos3 !== FALSE) {
  if ($endpos3 !== FALSE && ($endpos === FALSE || $endpos3 < $endpos)) {
      $endpos = $endpos3;
  }
}

if ($endpos4 !== FALSE) {
  if ($endpos4 !== FALSE && ($endpos === FALSE || $endpos4 < $endpos)) {
      $endpos = $endpos4;
  }
}

if ($endpos5 !== FALSE) {
  if ($endpos5 !== FALSE && ($endpos === FALSE || $endpos5 < $endpos)) {
      $endpos = $endpos5;
  }
}

if ($endpos6 !== FALSE) {
  if ($endpos6 !== FALSE && ($endpos === FALSE || $endpos6 < $endpos)) {
      $endpos = $endpos6;
  }
}

if ($endpos7 !== FALSE) {
  if ($endpos7 !== FALSE && ($endpos === FALSE || $endpos7 < $endpos)) {
      $endpos = $endpos7;
  }
}

if ($endpos === FALSE)
$endpos = strlen($textafter);

if ($endpos !== FALSE) {
  if (substr($textbefore,-7) == "http://") {
      $textbefore = substr($s,0,$varpos-7);
      $textafter = "http://".substr($s,$varpos);
      $endpos = $endpos+7;
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else if (substr($textbefore,-8) == "https://") {
      $textbefore = substr($s,0,$varpos-8);
      $textafter = "https://".substr($s,$varpos);
      $endpos = $endpos+8;
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else if (substr($textbefore,-6) == "ftp://") {
      $textbefore = substr($s,0,$varpos-6);
      $textafter = "ftp://".substr($s,$varpos);
      $endpos = $endpos+6;
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else {
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }
      if (substr($textafter,0,7) == "http://") {
        $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
      else if (substr($textafter,0,8) == "https://") {
        $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
      else if (substr($textafter,0,6) == "ftp://") {
        $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
      else {
        $link = "<a href=\"http://".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
  }

  $textafter = substr($textafter,$endpos);
  if (text_find($textafter,"www.") || text_find($textafter,"http://") || text_find($textafter,"https://") || text_find($textafter,"ftp://")) {
      // ### finder resten af adresserne
      $vartemp = $vartemp . $textbefore . $link;
      $s = ($textafter);
  }
  else {
      if (text_find($textafter,"www.") || text_find($textafter,"http://") || text_find($textafter,"https://") || text_find($textafter,"ftp://")) {
        $vartemp = $vartemp . $textbefore . $link;
        $s = ($textafter);
      }
      else {
        $vartemp = $vartemp . $textbefore . $link . $textafter;
        $found_more_links = FALSE;
      }
  }
}
else {
  if (substr($textbefore,-7) == "http://" || substr($textbefore,-8) == "https://" || substr($textbefore,-6) == "ftp://") {
      if (substr($textbefore,-7) == "http://") {
        $link = "<a href=\"".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
      }
      else {
        // !!! mangler https:// og ftp://
        $link = substr($textafter,0);
      }
  }
  else {
      $link = "<a href=\"http://".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
  }
  $textafter = substr($textafter,$endpos);
  $vartemp = $vartemp . $textbefore . $link;
  $found_more_links = FALSE;
}

if ($counter > 99) {
// denne counter er kun indsat for at stoppe scriptet hvis der er fejl.
$found_more_links = FALSE;
}

$counter++;

}

  return $vartemp;

}

function htmlencode($str_text) {
  $tmp_text = str_replace("<", "<", "$str_text");
  $tmp_text = str_replace(">", ">", "$tmp_text");
  return $tmp_text;
}

echo htmlencode(IntoLinks(htmlencode($text))) . "<br><br>";

echo IntoLinks(htmlencode($text));

?>

Avatar billede cht22 Professor
04. november 2013 - 23:49 #3
Det lykkedes at få lavet noget kode der virker:



<?php
$text = "Det her er en URL HTTP://www.dr.dk/Nyheder/Politik/2013/11/04/140341.htm.<b>skal</b> testes. Her er endnu et link www.tv2.dk. Det samme link igen: http://www.dr.dk/Nyheder/Politik/2013/11/04/140341.htm. Der kan være denne adresse FTP://www.servernavn-adresse.dk/filnavn.pdf Der kan også være http://www.dr.dk/tv/ eller http://dr.dk\nftp://192.168.0.1. Der kan også være http://192.168.0.1/ https://192.168.0.1/ www.dr.dk man kan godt skrive www og www. eller ftp:// der kan skrives med store bogstaver FTP://192.168.0.1 Ftp://192.168.0.1 ftp://192.168.0.1 http://dr.dk det er det sidste link.";

//$text = "http://dr.dk\r\n";
//$text = "http://www.dr.dk.";

function text_pos($strText,$strFind) {
  $varpos = strpos($strText,"$strFind");
  if (substr($strText,0,strlen($strFind)) == "$strFind") {
      $varpos = 0;
  }
  return $varpos;
}

function text_pos2($strText,$strFind) {
  // denne funktion søger efter lower case tekst
  $varpos = strpos(strtolower($strText),strtolower($strFind));
  if (substr(strtolower($strText),0,strlen($strFind)) == strtolower($strFind)) {
      $varpos = 0;
  }
  return $varpos;
}

function text_find($strText,$strFind) {
// ### Finder ud af om tekst indeholder bestemt streng ###
  $varpos = text_pos2("$strText","$strFind");
  if (!$varpos && substr($strText,0,strlen("$strFind")) != "$strFind") {
      return FALSE;
  }
  else {
      return TRUE;
  }
}

function IntoLinks($s) {

// ### Denne funktion finder kun første link!

// ### Adresser der starter med følgende
// ### bliver lavet om til links:
//
// www.
// http://
// https://
// ftp://

// Der er fjernelse af punktum hvis der står det i enden af adresse.

$vartemp = "";

$found_more_links = TRUE;
$counter = 0;

while ($found_more_links) {

$varpos = text_pos2($s,"www.");

if (text_pos2($s,"http://") > 0 && (text_pos2($s,"http://") < $varpos || $varpos == 0 || $varpos === FALSE))
$varpos = text_pos2($s,"http://");

if (text_pos2($s,"https://") > 0 && (text_pos2($s,"https://") < $varpos || $varpos == 0 || $varpos === FALSE))
$varpos = text_pos2($s,"https://");

if (text_pos2($s,"ftp://") > 0 && (text_pos2($s,"ftp://") < $varpos || $varpos == 0 || $varpos === FALSE))
$varpos = text_pos2($s,"ftp://");

$textbefore = substr($s,0,$varpos);

$textafter = substr($s,$varpos);

$endpos1 = text_pos2($textafter," ");
$endpos2 = text_pos2($textafter,"\r\n");
$endpos3 = text_pos2($textafter,"\n");
$endpos4 = text_pos2($textafter,"<");
$endpos5 = text_pos2($textafter,">");
$endpos6 = text_pos2($textafter,"&lt;");
$endpos7 = text_pos2($textafter,"&gt;");

$endpos = $endpos1;

if ($endpos2 !== FALSE) {
  if ($endpos2 !== FALSE && ($endpos === FALSE || $endpos2 < $endpos)) {
      $endpos = $endpos2;
  }
}

if ($endpos3 !== FALSE) {
  if ($endpos3 !== FALSE && ($endpos === FALSE || $endpos3 < $endpos)) {
      $endpos = $endpos3;
  }
}

if ($endpos4 !== FALSE) {
  if ($endpos4 !== FALSE && ($endpos === FALSE || $endpos4 < $endpos)) {
      $endpos = $endpos4;
  }
}

if ($endpos5 !== FALSE) {
  if ($endpos5 !== FALSE && ($endpos === FALSE || $endpos5 < $endpos)) {
      $endpos = $endpos5;
  }
}

if ($endpos6 !== FALSE) {
  if ($endpos6 !== FALSE && ($endpos === FALSE || $endpos6 < $endpos)) {
      $endpos = $endpos6;
  }
}

if ($endpos7 !== FALSE) {
  if ($endpos7 !== FALSE && ($endpos === FALSE || $endpos7 < $endpos)) {
      $endpos = $endpos7;
  }
}

if ($endpos === FALSE)
$endpos = strlen($textafter);

if ($endpos !== FALSE) {
  if (substr($textafter,0,7) == "http://") {
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }

      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else if (substr($textafter,0,6) == "ftp://") {
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else if (substr($textafter,0,8) == "https://") {
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }

  else if (substr($textbefore,-7) == "http://") {
      $textbefore = substr($s,0,$varpos-7);
      $textafter = "http://".substr($s,$varpos);
      $endpos = $endpos+7;
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else if (substr($textbefore,-8) == "https://") {
      $textbefore = substr($s,0,$varpos-8);
      $textafter = "https://".substr($s,$varpos);
      $endpos = $endpos+8;
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else if (substr($textbefore,-6) == "ftp://") {
      $textbefore = substr($s,0,$varpos-6);
      $textafter = "ftp://".substr($s,$varpos);
      $endpos = $endpos+6;
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }

  else {
      if (substr(substr($textafter,0,$endpos),-1) == ".") {
        $endpos = $endpos-1;
      }
      if (substr($textafter,0,7) == "http://") {
        $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
      else if (substr($textafter,0,8) == "https://") {
        $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
      else if (substr($textafter,0,6) == "ftp://") {
        $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
      else {
        $link = "<a href=\"http://".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
  }

  $textafter = substr($textafter,$endpos);
  if (text_find($textafter,"www.") || text_find($textafter,"http://") || text_find($textafter,"https://") || text_find($textafter,"ftp://")) {
      // ### finder resten af adresserne
      $vartemp = $vartemp . $textbefore . $link;
      $s = ($textafter);
  }
  else {
      $vartemp = $vartemp . $textbefore . $link . $textafter;
      $found_more_links = FALSE;
  }
}
else {
  if (substr($textbefore,-7) == "http://" || substr($textbefore,-8) == "https://" || substr($textbefore,-6) == "ftp://") {
      if (substr($textbefore,-7) == "http://") {
        $link = "<a href=\"".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
      }
      else if (substr($textbefore,-6) == "ftp://") {
        $link = "<a href=\"".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
      }
      else if (substr($textbefore,-8) == "https://") {
        $link = "<a href=\"".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
      }
  }
  else {
      $link = "<a href=\"http://".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
  }
  $textafter = substr($textafter,$endpos);
  $vartemp = $vartemp . $textbefore . $link;
  $found_more_links = FALSE;
}

if ($counter > 99) {
// denne counter er kun indsat for at stoppe scriptet hvis der er fejl.
$found_more_links = FALSE;
}

$counter++;

}

  return $vartemp;

}

function htmlencode($str_text) {
  $tmp_text = str_replace("<", "&lt;", "$str_text");
  $tmp_text = str_replace(">", "&gt;", "$tmp_text");
  return $tmp_text;
}

echo htmlencode(IntoLinks(htmlencode($text))) . "<br><br>";

echo IntoLinks(htmlencode($text));
?>

Avatar billede cht22 Professor
05. november 2013 - 00:37 #4
Der var lige en rettelse. Hvis der er en der ved hvordan man får gjort så adresser uden www. http:// https:// og ftp:// foran også kommer med, så giv lige besked. Det kan f.eks. være der står dr.dk eller wikipedia.org eller google.dk. Det gør ikke noget hvis mailadresser også bliver lavet om til links, så skal der bare være mailto: foran.



<?php
$text = "Det her er en URL HTTP://www.dr.dk/Nyheder/Politik/2013/11/04/140341.htm.<b>skal</b> testes. Her er endnu et link www.tv2.dk. Det samme link igen: http://www.dr.dk/Nyheder/Politik/2013/11/04/140341.htm. Der kan være denne adresse FTP://www.servernavn-adresse.dk/filnavn.pdf Der kan også være http://www.dr.dk/tv/ eller http://dr.dk\nftp://192.168.0.1. Der kan også være http://192.168.0.1/ https://192.168.0.1/ www.dr.dk man kan godt skrive www og www. eller ftp:// der kan skrives med store bogstaver FTP://192.168.0.1 Ftp://192.168.0.1 ftp://192.168.0.1 http://dr.dk det er det sidste link.";

//$text = "http://dr.dk\r\n";
//$text = "http://www.dr.dk.";
//$text = "Tekst uden links.";

function text_pos($strText,$strFind) {
  $varpos = strpos($strText,"$strFind");
  if (substr($strText,0,strlen($strFind)) == "$strFind") {
      $varpos = 0;
  }
  return $varpos;
}

function text_pos2($strText,$strFind) {
  // denne funktion søger efter lower case tekst
  $varpos = strpos(strtolower($strText),strtolower($strFind));
  if (substr(strtolower($strText),0,strlen($strFind)) == strtolower($strFind)) {
      $varpos = 0;
  }
  return $varpos;
}

function text_find($strText,$strFind) {
// ### Finder ud af om tekst indeholder bestemt streng ###
  $varpos = text_pos2("$strText","$strFind");
  if (!$varpos && substr(strtolower($strText),0,strlen("$strFind")) != strtolower($strFind)) {
      return FALSE;
  }
  else {
      return TRUE;
  }
}

function IntoLinks($s) {

// ### Denne funktion finder kun første link!

// ### Adresser der starter med følgende
// ### bliver lavet om til links:
//
// www.
// http://
// https://
// ftp://

// Der er fjernelse af punktum hvis der står det i enden af adresse.

$vartemp = "";

$found_more_links = TRUE;
$counter = 0;

while ($found_more_links) {

$varpos = text_pos2($s,"www.");

if (text_pos2($s,"http://") > 0 && (text_pos2($s,"http://") < $varpos || $varpos == 0 || $varpos === FALSE))
$varpos = text_pos2($s,"http://");

if (text_pos2($s,"https://") > 0 && (text_pos2($s,"https://") < $varpos || $varpos == 0 || $varpos === FALSE))
$varpos = text_pos2($s,"https://");

if (text_pos2($s,"ftp://") > 0 && (text_pos2($s,"ftp://") < $varpos || $varpos == 0 || $varpos === FALSE))
$varpos = text_pos2($s,"ftp://");

$textbefore = substr($s,0,$varpos);

$textafter = substr($s,$varpos);

$endpos1 = text_pos2($textafter," ");
$endpos2 = text_pos2($textafter,"\r\n");
$endpos3 = text_pos2($textafter,"\n");
$endpos4 = text_pos2($textafter,"<");
$endpos5 = text_pos2($textafter,">");
$endpos6 = text_pos2($textafter,"&lt;");
$endpos7 = text_pos2($textafter,"&gt;");

$endpos = $endpos1;

if ($endpos2 !== FALSE) {
  if ($endpos2 !== FALSE && ($endpos === FALSE || $endpos2 < $endpos)) {
      $endpos = $endpos2;
  }
}

if ($endpos3 !== FALSE) {
  if ($endpos3 !== FALSE && ($endpos === FALSE || $endpos3 < $endpos)) {
      $endpos = $endpos3;
  }
}

if ($endpos4 !== FALSE) {
  if ($endpos4 !== FALSE && ($endpos === FALSE || $endpos4 < $endpos)) {
      $endpos = $endpos4;
  }
}

if ($endpos5 !== FALSE) {
  if ($endpos5 !== FALSE && ($endpos === FALSE || $endpos5 < $endpos)) {
      $endpos = $endpos5;
  }
}

if ($endpos6 !== FALSE) {
  if ($endpos6 !== FALSE && ($endpos === FALSE || $endpos6 < $endpos)) {
      $endpos = $endpos6;
  }
}

if ($endpos7 !== FALSE) {
  if ($endpos7 !== FALSE && ($endpos === FALSE || $endpos7 < $endpos)) {
      $endpos = $endpos7;
  }
}

if ($endpos === FALSE)
$endpos = strlen($textafter);

if ($endpos !== FALSE) {
  if (substr($textafter,0,7) == "http://") {
      $lastchar = substr(substr($textafter,0,$endpos),-1);
      if ($lastchar == "." || $lastchar == ",") {
        $endpos = $endpos-1;
      }

      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else if (substr($textafter,0,6) == "ftp://") {
      $lastchar = substr(substr($textafter,0,$endpos),-1);
      if ($lastchar == "." || $lastchar == ",") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else if (substr($textafter,0,8) == "https://") {
      $lastchar = substr(substr($textafter,0,$endpos),-1);
      if ($lastchar == "." || $lastchar == ",") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }

  else if (substr($textbefore,-7) == "http://") {
      $textbefore = substr($s,0,$varpos-7);
      $textafter = "http://".substr($s,$varpos);
      $endpos = $endpos+7;
      $lastchar = substr(substr($textafter,0,$endpos),-1);
      if ($lastchar == "." || $lastchar == ",") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else if (substr($textbefore,-8) == "https://") {
      $textbefore = substr($s,0,$varpos-8);
      $textafter = "https://".substr($s,$varpos);
      $endpos = $endpos+8;
      $lastchar = substr(substr($textafter,0,$endpos),-1);
      if ($lastchar == "." || $lastchar == ",") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }
  else if (substr($textbefore,-6) == "ftp://") {
      $textbefore = substr($s,0,$varpos-6);
      $textafter = "ftp://".substr($s,$varpos);
      $endpos = $endpos+6;
      $lastchar = substr(substr($textafter,0,$endpos),-1);
      if ($lastchar == "." || $lastchar == ",") {
        $endpos = $endpos-1;
      }
      $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
  }

  else {
      $lastchar = substr(substr($textafter,0,$endpos),-1);
      if ($lastchar == "." || $lastchar == ",") {
        $endpos = $endpos-1;
      }
      if (substr($textafter,0,7) == "http://") {
        $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
      else if (substr($textafter,0,8) == "https://") {
        $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
      else if (substr($textafter,0,6) == "ftp://") {
        $link = "<a href=\"".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
      else if (substr($textafter,0,4) == "www.") {
        $link = "<a href=\"http://".substr($textafter,0,$endpos)."\" target=_blank>".substr($textafter,0,$endpos)."</a>";
      }
      else {
        $link = substr($textafter,0,$endpos);
      }
  }

  $textafter = substr($textafter,$endpos);
  if (text_find($textafter,"www.") || text_find($textafter,"http://") || text_find($textafter,"https://") || text_find($textafter,"ftp://")) {
      // ### finder resten af adresserne
      $vartemp = $vartemp . $textbefore . $link;
      $s = ($textafter);
  }
  else {
      $vartemp = $vartemp . $textbefore . $link . $textafter;
      $found_more_links = FALSE;
  }
}
else {
  if (substr($textbefore,-7) == "http://" || substr($textbefore,-8) == "https://" || substr($textbefore,-6) == "ftp://") {
      if (substr($textbefore,-7) == "http://") {
        $link = "<a href=\"".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
      }
      else if (substr($textbefore,-6) == "ftp://") {
        $link = "<a href=\"".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
      }
      else if (substr($textbefore,-8) == "https://") {
        $link = "<a href=\"".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
      }
  }
  else {
      $link = "<a href=\"http://".substr($textafter,0)."\" target=_blank>".substr($textafter,0)."</a>";
  }
  $textafter = substr($textafter,$endpos);
  $vartemp = $vartemp . $textbefore . $link;
  $found_more_links = FALSE;
}

if ($counter > 99) {
// denne counter er kun indsat for at stoppe scriptet hvis der er fejl.
$found_more_links = FALSE;
}

$counter++;

}

  return $vartemp;

}

function htmlencode($str_text) {
  $tmp_text = str_replace("<", "&lt;", "$str_text");
  $tmp_text = str_replace(">", "&gt;", "$tmp_text");
  return $tmp_text;
}

echo htmlencode(IntoLinks(htmlencode($text))) . "<br><br>";

echo IntoLinks(htmlencode($text));
?>

Avatar billede cht22 Professor
05. november 2013 - 12:57 #5
Man kunne måske også bruge explode i stedet for og få f.eks. dr.dk med og få en lidt kortere kode på den måde. Men det giver umiddelbart nogle andre problemer, fordi det ser ud til at det ofte forekommer at der f.eks. står links skrevet på den her måde.http://www.dr.dk. Det vil sige hvor der ikke er mellemrum foran linket. Det kunne også være der stod. Her er et link.www.dr.dk. Så virker den tidligere kode umiddelbart bedre.



<?php
// ### finder links i tekststreng.

// For at finde de adresser der skal laves om til links,
// så kontrolleres der hvad der står efter punktumerne.
// Står der mindst to bogstaver så skal adressen laves
// om til link.

$text = "Dette er en tekst. Med adresser www.dr.dk der kan også stå www.dr.dk. Der kan.";
//$text = "Test";

$text = "Det her er en URL HTTP://www.dr.dk/Nyheder/Politik/2013/11/04/140341.htm.<b>skal</b> testes. Her er endnu et link www.tv2.dk. Det samme link igen: http://www.dr.dk/Nyheder/Politik/2013/11/04/140341.htm. Der kan være denne adresse FTP://www.servernavn-adresse.dk/filnavn.pdf Der kan også være http://www.dr.dk/tv/ eller http://dr.dk\nftp://192.168.0.1. Der kan også være http://192.168.0.1/ https://192.168.0.1/ www.dr.dk man kan godt skrive www og www. eller ftp:// der kan skrives med store bogstaver FTP://192.168.0.1 Ftp://192.168.0.1 ftp://192.168.0.1 http://dr.dk det er det sidste link.";

$text_array = explode(".",$text);

// !!! Det er under udarbejdelse lige nu er det kun
// første link der bliver fundet.

$letters = "abcdefghijklmnopqrstuvwxyz";

function text_posr($strText,$strFind) {
  $varpos = strrpos($strText,$strFind);
  return $varpos;
}

function text_pos($strText,$strFind) {
  $varpos = strpos($strText,"$strFind");
  if (substr($strText,0,strlen($strFind)) == "$strFind") {
      $varpos = 0;
  }
  return $varpos;
}

function text_find_next($strText,$strStart,$strEnd) {

// ### finder tekst i en tekst og slutter ved bestemt tekst.

// Der bruges tegnet mellemrum ved tom stregn ellers er det ikke muligt at kende forskel på ikke fundet og tom streng.

$error = FALSE;

if ($strStart != "") {
$varpos = strpos("$strText","$strStart");

if (!$varpos && substr($strText,0,strlen("$strStart")) != "$strStart") {
$varText = "";
$error = TRUE;
}
else {
$varText = substr($strText,$varpos+strlen("$strStart"));
}
}
else {
$varText = $strText;
}

if ($strEnd != "") {
$varpos = strpos("$varText","$strEnd");

if (substr($varText,0,strlen("$strEnd")) == "$strEnd") {
//$varText = "empty string";
$varText = " ";

}
else if (!$varpos) {
$error = TRUE;
}
else if (!$error) {
$varText = substr($varText,0,$varpos);
}
}

if ($error)
return FALSE;
else
return $varText;
}

function text_find($strText,$strFind) {

// ### Finder ud af om tekst indeholder bestemt streng ###

$varpos = strpos("$strText","$strFind");

if (!$varpos && substr($strText,0,strlen("$strFind")) != "$strFind") {
return FALSE;
}
else {
return TRUE;
}

}

$startoflink = 0;
$before = "";

for ($i=0;$i<count($text_array);$i++) {
  if (strpos($letters,substr($text_array[$i],0,1)) && strpos($letters,substr($text_array[$i],1,1))) {
      $link = $text_array[$i];
      //echo $link . ".<br>";
      if ($startoflink == 0) {
        $startoflink = $i;
        $i = count($text_array)+1;
      }
  }
}

if ($startoflink > 0) {

$endoflink = 0;

for ($i=$startoflink;$i<count($text_array);$i++) {
  if ($endoflink == 0 && (text_find($text_array[$i]," ") || text_find($text_array[$i],"\n") || text_find($text_array[$i],"<") || text_find($text_array[$i],">"))) {
  $endoflink = $i;
  }
}

$i = $startoflink;

$before = text_posr($text_array[$i-1]," ");

if (text_posr($text_array[$i-1],"\n") > $before)
$before = text_posr($text_array[$i-1],"\n");

if (text_posr($text_array[$i-1],"<") > $before)
$before = text_posr($text_array[$i-1],"<");

if (text_posr($text_array[$i-1],">") > $before)
$before = text_posr($text_array[$i-1],">");

$before = substr($text_array[$i-1],$before);

echo "<br><br>Første adresse er: " . "<br>" . $before . ".";

for ($i=$startoflink;$i<$endoflink+1;$i++) {
      $link = $text_array[$i];

      if ($i == $endoflink) {
        // !!! skal kunne stoppe ved følgende tegn: " ", "<", ">", "\n", "\r\n", "&lt;", "&gt;"
        if (text_find($link,"<"))
        echo (text_find_next($link,"","<"));

        else if (text_find($link," "))
        echo (text_find_next($link,""," "));

      }
      else {
        echo $link . ".";
      }
}

}
?>

Avatar billede cht22 Professor
07. november 2013 - 23:38 #6
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester