Avatar billede nomak Nybegynder
16. juni 2003 - 14:18 Der er 22 kommentarer og
1 løsning

url replacer.. altså http://noget.dk om til <a href= osv.

Hey E!

Jeg står og mangler en URL relpacer, og da C ikke har en reg. replace funktion, er jeg lidt blank!

Det jeg søger er stort set idéen til at lave funktionen, eller en lille kode jeg selv kan udbygge efter behov..

her er et lille eksempen på hvordan det skal virke:

http://noget.dk -> <a href="http://noget.dk">noget.dk</a>
http://www.noget_andet.dk -> <a href="http://www.noget_andet.dk">www.noget_andet.dk</a>

/NoMak
Avatar billede arne_v Ekspert
16. juni 2003 - 14:29 #1
En primitiv løsning:

char *url;
char res[1024];
...

sprintf(res,"<a href=\"%d\">%s</a>",url,url+7);
Avatar billede arne_v Ekspert
16. juni 2003 - 14:29 #2
Vrøvl. Det skal være:

sprintf(res,"<a href=\"%s\">%s</a>",url,url+7);

(jeg havde skrevet %d ikke %s første gang)
Avatar billede arne_v Ekspert
16. juni 2003 - 14:31 #3
Hvis den skal være lidt mere avanceret, så skal man kunne
håndtere URL'er med andre protokoller end http og delvise
URL'er uden protokol.

Hvor avanceret skal du bruge det ?
Avatar billede nomak Nybegynder
16. juni 2003 - 14:34 #4
well, den skulle jo gerne kunne tjekke en hel text-streng efter urls og så lave dem om..

og http er nok til at starte med! kan altid lave det om :)
Avatar billede arne_v Ekspert
16. juni 2003 - 14:37 #5
Ah - det er mere et matching problem end et replace problem - og det var
selvfølgelig derfor du snakkede om regex.

Tilgiv mig hvis jeg er lidt langsom i opfattelsen.
Avatar billede nomak Nybegynder
16. juni 2003 - 14:40 #6
Hehe det gør ikke noget :)

har fået en ide.. men ved ikk hhelt hvordan den skal kringles kodemessigt..

altså, først deler den strengen op ved space " " <--

derefter tjekker den hver enkelt opdelt streng om de første 7 chars er http://

så kan man vel kringle det sidste på en eller anden måde..
Avatar billede nomak Nybegynder
16. juni 2003 - 14:41 #7
hmm, tænke tænke, det er vel ikke det fedeste performance messigt?
Avatar billede arne_v Ekspert
16. juni 2003 - 14:43 #8
Det er ikke så svært at få delt op ved space.

Men er det godt nok ?

"Se eksemplet på http://www.eksmepler.dk/, hvor ..."

Der ryger komma med til sidst så.
Avatar billede nomak Nybegynder
16. juni 2003 - 14:44 #9
hmm, det er jo rigtigt nok.. argh :(
Avatar billede arne_v Ekspert
16. juni 2003 - 14:44 #10
Jeg tror at det var bedre at søge efter "http://" og så søge videre
efter en delimiter (mellemrum, komma, punktum etc.).
Avatar billede arne_v Ekspert
16. juni 2003 - 14:46 #11
Jeg prøver lige at lave et lille stykke kode.
Avatar billede nomak Nybegynder
16. juni 2003 - 15:01 #12
venter spændt :P
Avatar billede arne_v Ekspert
16. juni 2003 - 15:06 #13
#include <stdio.h>
#include <string.h>

void find_and_replace(char *s1, char *s2)
{
  int ix1,ix2,l;
  ix1 = 0;
  ix2 = 0;
  while(ix1 < strlen(s1))
  {
      if(strncmp(s1+ix1,"http://",7)==0)
      {
          s2[ix2] = '\0';
          strcat(s2,"<a href=\"");
          ix2 += 9;
          l = 0;
          while(s1[ix1+l]!=' ' && s1[ix1+l]!=',' && s1[ix1+l]!='\0') l++;
          strncat(s2,s1+ix1,l);
          ix2 += l;
          strcat(s2,"\">");
          ix2 += 2;
          strncat(s2,s1+ix1+7,l-7);
          ix2 += (l - 7);
          strcat(s2,"</a>");
          ix2 += 4;
          ix1 += l;
      }
      else
      {
          s2[ix2] = s1[ix1];
          ix1++;
          ix2++;
      }
  }
  s2[ix2] = '\0';
}

int main()
{
  char input[] = "Dette er en prøve http://www.eksperten.dk, hvor\n"
                  "vi tester om vi kan finde links som http://www.eksperten.dk !\n";
  char *output;
  printf("%s",input);
  output = (char *)malloc(4*strlen(input));
  find_and_replace(input,output);
  printf("%s",output);
  free(output);
  return 0;
}
Avatar billede arne_v Ekspert
16. juni 2003 - 15:06 #14
Men det er dæleme ikke kønt kode.
Avatar billede nomak Nybegynder
16. juni 2003 - 15:10 #15
Nu har jeg ikke leget med malloc() før, så kan du ikke forklare hvad det er den gør, og hvorfor den er nødvendig for denne funktion..?
Avatar billede arne_v Ekspert
16. juni 2003 - 15:16 #16
malloc i C svarer lidt til new i C++.

I C++ kunne man have sagt:

output = new char[4*strlen(input)];
...
delete[] output;
Avatar billede arne_v Ekspert
16. juni 2003 - 15:17 #17
Og den er vel ikke strengt nødvendigt - jeg synes bare ta det var smart
at allokere plads til output udfra længden af input.
Avatar billede nomak Nybegynder
16. juni 2003 - 16:45 #18
Glemte lige at skrive at det <a href tag skulle have en target=_blank .. har prøvet at sætte det ind, men det failer?
Avatar billede arne_v Ekspert
16. juni 2003 - 16:54 #19
Det virker for mig:

#include <stdio.h>
#include <string.h>

void find_and_replace(char *s1, char *s2)
{
  int ix1,ix2,l;
  ix1 = 0;
  ix2 = 0;
  while(ix1 < strlen(s1))
  {
      if(strncmp(s1+ix1,"http://",7)==0)
      {
          s2[ix2] = '\0';
          strcat(s2,"<a href=\"");
          ix2 += 9;
          l = 0;
          while(s1[ix1+l]!=' ' && s1[ix1+l]!=',' && s1[ix1+l]!='\0') l++;
          strncat(s2,s1+ix1,l);
          ix2 += l;
          strcat(s2,"\" target=_blank>");
          ix2 += 16;
          strncat(s2,s1+ix1+7,l-7);
          ix2 += (l - 7);
          strcat(s2,"</a>");
          ix2 += 4;
          ix1 += l;
      }
      else
      {
          s2[ix2] = s1[ix1];
          ix1++;
          ix2++;
      }
  }
  s2[ix2] = '\0';
}

int main()
{
  char input[] = "Dette er en prøve http://www.eksperten.dk, hvor\n"
                  "vi tester om vi kan finde links som http://www.eksperten.dk !\n";
  char *output;
  printf("%s",input);
  output = (char *)malloc(4*strlen(input));
  find_and_replace(input,output);
  printf("%s",output);
  free(output);
  return 0;
}
Avatar billede nomak Nybegynder
17. juni 2003 - 11:37 #20
ah, havde ikk lige tænkt på at ix2 skulle være højere :P

tak for hjælpen :)
Avatar billede nomak Nybegynder
19. juni 2003 - 19:00 #21
Det er nok for sent at skrive det nu, men kan man begrænse det til at den kun replacer éen gang.. altså første link, og lader resten i strengen være?

mit program bliver overloaded hvos der er mange i
Avatar billede arne_v Ekspert
19. juni 2003 - 22:17 #22
Det kan du da sagtens.

...
int fndone;
...
fndone = 0;
while(ix1 < strlen(s1))
{
  if(!fndone && strncmp(s1+ix1,"http://",7)==0)
  {
      fndone = 1;
...
Avatar billede nomak Nybegynder
20. juni 2003 - 23:51 #23
takker :)
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
Kurser inden for grundlæggende programmering

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