Avatar billede larsmartin Praktikant
19. september 2012 - 10:49 Der er 13 kommentarer og
1 løsning

Nummer genkendelse i regular expression

Hej,
Jeg har en hjemmeside hvor jeg gerne vil sikre mig, at jeg får entydige sider. Adressen er lidt lang så i forkortet version er det.
http://adresse.aspx?ID=7&Author=Elizabeth-Buchan

Alt efter ID=7 er principielt ligegyldigt for at få den rigtige side, men vigtigt af andre årsager.
Derfor vil jeg gerne kunne opfange adressen
http://adresse.aspx?ID=7
Og sende den til den korrekte
http://adresse.aspx?ID=7&Author=Elizabeth-Buchan

Jeg kan godt finde ud af at genkende ID=7, mit problem er at ID=70 til ID=79 også bliver genkendt som ID=7.
Det er klart at ID=7 og ID=70 eller ID=701 skal kunne adskilles.

Det vil sige efter ID= vil der være 1 til 3 tal og derefter enten et & tegn eller tomt.

Håber det giver mening og håber i kan hjælpe:)

Venlig hilsen
Lars
Avatar billede tjp Mester
19. september 2012 - 11:52 #1
Følgende matcher '?ID=' efterfulgt af 1 til 3 tal og som enten står til sidst eller efterfølges af '&' evt plus noget mere:

\?ID=(\d{1,3})(&.+)?$

Selve talværdien er at finde i første submatch. Vil du ha 'ID=' med skal venstre parantesen flyttes:

\?(ID=\d{1,3})(&.*)?$
Avatar billede larsmartin Praktikant
19. september 2012 - 12:45 #2
Hej,
Tak, lige nu sidder jeg og tænker, hvordan kommer jeg så videre...
Den bedste løsning er selvfølgelig at lave noget kode, der sørger for at jeg får den rigtige endelse på eksempelvis
&Author=Elizabeth-Buchan
til ID=7
Og til ID=70 kunne det være endelsen
&Author=Lars-Martin

Det må blive step to, for nu vil jeg så skrive dem alle manuelt, så jeg fanger og redirecter dem en af gangen.
Så måske jeg skulle have spurgt

Hvordan identificerer jeg ID=7 og hvordan identificerer jeg ID=70
og ID=708
Avatar billede johny Nybegynder
19. september 2012 - 12:51 #3
(Jeg har skrevet nedenstående kommentar før dit seneste indlæg, men gør det ikke det du efterspørger, ellers må du nok præcisere dit problem yderligere.)

Ville nok bare nøjes med x antal digits så du er fremtidssikret ;)

/* Kode eksempel
****************/
private Regex _regex = new Regex(@"aspx\?ID=(?<ID>\d+)", RegexOptions.Compiled);

private int GetIdFromUrl(string url)
{
  //antager at du har sørget for at intet kan gå galt:
  return int.Parse(_regex.Match(url).Groups["ID"].Value);
}

/* Kode eksempel slut
*********************/

Husker du for i øvrigt at benytte dig af rel="canonical" headeren?
Avatar billede larsmartin Praktikant
19. september 2012 - 14:04 #4
Hej,
Måske er det mig der ikke helt forstår det i skriver, eller jeg ikke forklarer det godt nok.

Udfordringen er at jeg skal have knyttet navn og ID sammen i URL. Og problemet er at alle disse tre sider peger samme sted hen
http://adresse.aspx?ID=7
http://adresse.aspx?ID=7&Author=Lars-Martin
http://adresse.aspx?ID=7&Author=Elizabeth-Buchan
Jeg vil gerne have at de to øverste bliver ledt til den nederste Elizabeth-Buchan

Samtidig skal jeg sørge for at
http://adresse.aspx?ID=77 ikke bliver ledt til
http://adresse.aspx?ID=7&Author=Elizabeth-Buchan

Så vidt jeg kan se, hjælper de eksempler i kommer med ikke på det.

Lige nu vil jeg nok bare gøre det helt lavpraktisk og identificerer hver enekelt id og sende det til den rigtige adresse.
Der er under 30, så selv om det er kedeligt at skrive 30 redirects, så er det overkommeligt.
På sigt må jeg få lavet noget kode, der kan sørge for det sker automatisk.

I øvrigt meget nyttigt link omkring kanoniske sider, men igen er udfordringen at jeg i mine metatags, har en løsning der bruger URL'en.
Så når jeg får redirected URL rigtigt, så burde jeg slippe for uhensigtsmæssige "duplpicate" sider.
Avatar billede johny Nybegynder
19. september 2012 - 14:15 #5
Hmm, så er jeg nok ikke helt med på hvad du forsøger, hvis "alt efter ID er ligegyldigt", hvis du så samtidig altid laver et 301 redirect til den "endelige" side.

Men hvor er informationen så om, hvilken id der hører til hvilken forfatter/person? Er nok den stump vi mangler for at kunne levere en generel løsning?

Hvad bruger du for i øvrigt til at håndtere dette, for ser for mig ud til at du blot kan bruge Routing til at klare det meste automatisk?
Avatar billede johny Nybegynder
19. september 2012 - 14:16 #6
"Adressen er lidt lang så i forkortet version er det." - er der flere parametre du mangler at komme med her?
Avatar billede larsmartin Praktikant
19. september 2012 - 14:40 #7
Jeg har en access database hvor alle oplysningerne ligger og id er den unikke identifikation til hver post i databasen.

Derfor er det kun ID nr der er nødvendigt for at finde det rigtige indhold.

Men mine metatags, Title mm er afhængige af URL, så når URL er forkert er metatags og title forkert.

Og den korrekte/optimale url for ID=7 er altså
http://adresse.aspx?ID=7&Author=Elizabeth-Buchan

Det giver den korrekte title Biography: Elizabeth Buchan
mens
http://adresse.aspx?ID=7&Author=Lars-Martin
Giver den samme side omkring Elizabeth Buchan, men nu med title
Biography: Lars Martin

Og det er jo noget rod, og derfor vigtigt at jeg får redirected alt med ID=7 til
http://adresse.aspx?ID=7&Author=Elizabeth-Buchan

Giver det bedre mening nu?
Avatar billede johny Nybegynder
19. september 2012 - 14:59 #8
Hmm, nedenstående parser url'en for dig, men ved ikke helt om det er det du skal bruge? Lyder jo næsten som om du bare kan bruge en løsning hvor du henter ID fra url, sammensætter den korrekte url, og så ser om den er lig med den url du er på, hvis ikke, så redirect.

En helt anden sag er så, at dine metatags ikke burde have noget med din URL at gøre, men blot være noget du smed på der hvor du rent faktisk havde informationen fra databasen.

/* Kode eksempel
****************/

private Regex _regex = new Regex(@"aspx\?ID=(?<ID>\d+)(?:&Author=(?<Author>[^&]+))?", RegexOptions.Compiled);

private UrlData GetDataFromUrl(string url)
{
  var result = new UrlData();

  var match = _regex.Match(url);

  //antager at du har sørget for at intet kan gå galt:
  result.ID = int.Parse(match.Groups["ID"].Value);

  if (match.Groups["Author"].Success)
  {
    result.Author = match.Groups["Author"].Value;
  }

  return result;
}

private class UrlData
{
  int ID;
  string Author;
}

/* Kode eksempel slut
*********************/
Avatar billede larsmartin Praktikant
19. september 2012 - 15:29 #9
Hej,
Det ser ud til du prøver at lave en langsigtet løsning, men jeg er ret sikker på, at jeg ikke kan copy paste det direkte ind og forvente at de rigtige værdier bliver plukket i databasen.

Derfor ville jeg sådan set gerne bare være i stand til at identificere
http://adresse.aspx?ID=7
Uanset hvad der ellers kommer efter 7 (hvis det da ikke er et tal mere)

og redirecte det til
http://adresse.aspx?ID=7&Author=Elizabeth-Buchan
Avatar billede johny Nybegynder
19. september 2012 - 17:06 #10
Hej igen

Du får lige en hurtig løsning her så:

string url = "http://adresse.aspx?ID=7&Author=Elizabeth-Buchan";

int ID = int.Parse(Regex.Match(@"\?ID=(\d+)", url).Groups[0].Value);

string correctUrl = "<DinBaseUrl>" + "?ID=" + ID + "&Author=" + GetAuthorByID(ID); //GetAuthorByID slår op i din DB efter author for den ID du er på...

if (correctUrl.ToUpperInvariant() == url.ToUpperInvariant())
{
  //success!
}
else
{
  Perform301Redirect(correctUrl);
}
Avatar billede johny Nybegynder
19. september 2012 - 17:15 #11
Og så lige et par kommentarer :)

1) Dine meta tags bør ikke afhænge af din url. Hvis du har de korrekte informationer i din database, bør du ikke bruge url'en til at håndtere den slags.

2) Hvis du er igang med at håndtere dine url'er, er der så en bestemt grund til at du kører med id baserede sider, istedet for mere deskriptive url'er? (som f.eks. "/Elizabeth-Buchan/7" - og gerne med titlen som en del af url'en også)

3) Når du arbejder i ASP.NET, så kan Routing helt klart anbefales til at håndtere url'er, og hvis du blot har den ene side, kan det at lave det i ASP.NET MVC i stedet også klart anbefales, da routing så er meget mere integreret. :)
Avatar billede larsmartin Praktikant
19. september 2012 - 17:27 #12
Hej,
Der er mange ting jeg skal kigge nærmere på og det er jeg glad for.
Men jeg har stadig ikke fået svar...

?id=777&sdf
?id=7&
?id=7&Author
?id=7
?id=777

Det jeg efterspørger er et udtryk der kan finde de 3 midterste. Jeg eksperimenterer lige nu med
\?ID=7[^\d+]?[w+]?$
Det udtryk finder 2 og 4 men den finder ikke 3
?id=7&Author
Avatar billede johny Nybegynder
19. september 2012 - 21:01 #13
Har du prøvet den løsning jeg skrev? Den burde klare alle de eksempler du listede?
Avatar billede johny Nybegynder
20. september 2012 - 08:15 #14
Hmm, opdagede lige at du kun ville fange de 3 midterste ovenfor. De sidste 2 skal ikke håndteres, eller hvad er du ude efter?

Men lad os lige skifte totalt spor: Er der nogen bestemt grund til du vil håndtere det med Regex og ikke blot bruge "HttpRequest[paramName]"? Der kan du jo blot spørge på "ID" og "Author" og så derigennem om url'en er korrekt?
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