Avatar billede nomak Nybegynder
29. juni 2003 - 14:07 Der er 5 kommentarer og
1 løsning

hjælp til min url relpacer ang. begrænsning

ligenu har jeg flg. kode..


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

void find_and_replace(char *s1, char *s2)
{
  int ix1,ix2,l,fndone;
  ix1 = 0;
  ix2 = 0;
  fndone = 0;
  while(ix1 < strlen(s1))
  {
      if(!fndone && strncmp(s1+ix1,"http://",7)==0)
      {
    fndone = 1;
          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"
                  "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;
}

som i nok kan se, ER der begrænsning på et link.. vel at mærke kun hvis der er mellemrum i mellem.. hvis de skrives sammen som dette eksempel, går det galt, da man kan crashe mit progream ved at skrive en lidt for lang url på den måde..

http://www.eksperten.dkhttp://www.eksperten.dk

skulle blive til
<a href...>www.eksperten.dk</a>http://www.eksperten.dk
Avatar billede arne_v Ekspert
29. juni 2003 - 15:48 #1
Den burde ikke crashe.

Og det gør den heller ikke hos mig,

Men den vil naturligvis give et "forkert" resultat-

Men hvodan vil du detecte at den ene URL er færdig ?

Koden stopper ved mellemrum og komma.

Vi kunne godt stoppe med http://, men hvad så med alle
mulige andre tekster ?

http://www.eksperten.dkDette er en test

Den menneskelige hjerne kan genkende at .dk er slutningen
på en URL og at det andet er almindelige ord.

Men det er svært at programmere.
Avatar billede nomak Nybegynder
29. juni 2003 - 16:52 #2
Bare den stopper ved http:// er det fint.. har skrevet en chatserver hvor jeg bruger det, og hvis de skriver det på den måde - for mange gange - crasher den

har jo en char text[300], og hvis det så overskrider det, crasher den jo
Avatar billede arne_v Ekspert
29. juni 2003 - 17:09 #3
Prøv med:

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

void find_and_replace(char *s1, char *s2)
{
  int ix1,ix2,l,fndone;
  ix1 = 0;
  ix2 = 0;
  fndone = 0;
  while(ix1 < strlen(s1))
  {
      if(!fndone && strncmp(s1+ix1,"http://",7)==0)
      {
          fndone = 1;
          s2[ix2] = '\0';
          strcat(s2,"<a href=\"");
          ix2 += 9;
          l = 0;
          while(s1[ix1+l]!=' ' && s1[ix1+l]!=',' && s1[ix1+l]!='\0' &&
                l==0 || (strncmp(s1+ix1+l,"http://",7)!=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"
                  "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 segmose Nybegynder
30. juni 2003 - 12:25 #4
Jeg har leget lidt med arne_v's løsning.
Erstattet alle magiske tal og strenge i programmet med rigtige constanter => bør give færre fejl.
Erstattet find http med en strstr.
Erstat de fleste strcpy med memcpy, burde være hurtigere.
fndone kunne fjernes da nomak's oprindelige kode ikke tager højde for flere http i samme streng.
Det er en forudsætning at hele URL delen er i lower case ellers virker værken den oprindelige eller arne_v's eller min version ikke!!!
Det er forsøgt at minimere streng operationerne så meget som muligt, for at spare tid.
Der burde checkes for buffer overflow i s2, eller føres bevis for at s2 aldrig kan overflow'e.

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

const char
  *http = "http://",
  *target = "\" target=_blank>",
  *href = "<a href=\"http://",
  *enda = "</a>";
const int // or set in main if using C and it doesn't work.
  httplen = strlen(http),
  targetlen = strlen(target),
  endalen = strlen(enda),
  hreflen = strlen(hreflen);

void find_and_replace(char *s1, char *s2) {
  int
    l,
    fndone = 0;
  char
    *findhttp;

  findhttp = strstr(s1, http); // find first occurance of "http://" in s1

  if (findhttp) {
    if (!fndone) {
      fndone = 1;

      l = findhttp - s1; // we may use pointer arith because they point to same array.
      memcpy(s2, s1, l); // memcpy because we know they are none overlapping.
      s1 += l + httplen; // jump over http:// avoiding extra check in while.
      s2 += l;
      memcpy(s2, href, hreflen);
      s2 += hreflen;

      while(*s1 != ' ' && *s1 != ',' && *s1 != '\0' &&
        (*s1 != 'h' || (strncmp(s1+1, http+1, httplen-1)!=0)) // dont start strncmp unless really needed
        ) {
    *s2++ = *s1++; // copy url to s2
      };

      memcpy(s2, target, targetlen);
      s2 += targetlen;

      // Add URL without http://
      findhttp += httplen;
      l = s1-findhttp;
      memcpy(s2, findhttp, l);
      s2 += l;

      // add /a
      memcpy(s2, enda, endalen);
      s2 += endalen;
    }
  }
  *s2 = '\0'; // or strcat doesn't work.
  strcat(s2, s1);
}

int main() {
  char *input[] = {
    "dette er en pr›ve http://www.eksperten.dk"
    "http://www.eksperten.dk !\n",
    "dette er en pr›ve http://www.snydt.dk"
    "http://www.eksperten.dk !\n",
    "dette er en pr›ve http://www.eksperten.dk uden extra http !\n",
    "her er ingen http !\n",
    NULL
  };
  char *output;
  int i = 0;

  while (input[i]) {
    printf("%s",input[i]);
    output = (char *)malloc(4*strlen(input[i]));
    // her er vi s† sikker p† at alt http er i lower case?
    find_and_replace(input[i],output);
    printf("%s\n",output);
    free(output);
    i++;
  }

  return 0;
}
Avatar billede arne_v Ekspert
30. juni 2003 - 13:40 #5
4*strlen(input[i]) er ikke sikkert.

2*strlen(input[i])+29 burde være sikkert.

Og deraf ses det også at hvis input er længere end 15, så er den første
formel også sikker.
Avatar billede segmose Nybegynder
30. juni 2003 - 14:22 #6
2*URL længde(som er mindste længde, da den skal skrives 2 gange) + 36 (div. html snask) - strlen("http://").
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis