Avatar billede milandt Nybegynder
07. august 2008 - 17:27 Der er 8 kommentarer og
1 løsning

Fjern specialchars fra en string

Hej eksperter

Jeg er ved at bygge en løsning i et CMS, hvor brugeren kan uploade en PowerPoint, hvilket så opretter en CMS node for hver slide i mit CMS.

Navnet på min CMS node henter jeg fra en shape i den pågældende PowerPoint slide.

Jeg har jo meget lidt kontrol over hvad navnene således bliver, og jeg er f.eks. støt på følgende:

"\vSlide titel"

Det escapede v kan jeg ikke lige regne ud hvad betyder, men det er nok noget PowerPoint formattering.

Når der oprettes en CMS node med "\vSlide titel" som navn så går CMS sustemet UI i stykker, da det treeview der viser content noderne er lavet med JavaScript, der åbenbart brækker halsen i dette senarie.

Mit spørgsmål, hvordan undgår jeg dette, samt lignende tilfælde? Hvordan kan jeg trimme/filtrere/replace min titel string så den kun består af gængse karakterer?

Med venlig hilsen
Dennis
Avatar billede arne_v Ekspert
07. august 2008 - 17:31 #1
Du kan strippe alle de tegn du ikke vil have vaek med en regex replace:

s = Regex.Replace(s, "[^A-Za-z0-0_]", "");
Avatar billede arne_v Ekspert
07. august 2008 - 17:33 #2
s = Regex.Replace(s, "[^A-Za-z0-9_]", "");

indsaet selv de tegn som du vil acceptere.

Jeg regner med at du allerede har et test for uniqueness.
Avatar billede arne_v Ekspert
07. august 2008 - 18:01 #3
Og hvis performance er vigtig, saa faa den regex compiled.
Avatar billede milandt Nybegynder
08. august 2008 - 09:54 #4
Mange tak for svaret. Jeg endte op med følgende:

title = Regex.Replace(title, "[^" + (char)32 + "-" + (char)127 + "]", "", RegexOptions.Compiled);

Læg et "svar".
Avatar billede arne_v Ekspert
08. august 2008 - 15:13 #5
svar
Avatar billede arne_v Ekspert
08. august 2008 - 15:15 #6
Hvis du vil compile, saa vil jeg nok foreslaa at genbruge et objekt fremfor at bruge
den static metode.
Avatar billede milandt Nybegynder
08. august 2008 - 16:00 #7
Hvilket objekt skal jeg genbruge? En instans af Regex?

Hvordan ville det kunne gøres smart?

Metoden hvorfra jeg bruger ovenståend eliniekode er statisk.
Avatar billede arne_v Ekspert
08. august 2008 - 16:19 #8
Ja.

Bare lav et objekt og genbrug det.
Avatar billede arne_v Ekspert
08. august 2008 - 16:20 #9
For illustration proev og koer dette:

using System;
using System.Text.RegularExpressions;

namespace E
{
    public class Program
    {
        private const int N = 1000000;
        public static void Test1()
        {
            string s = "Dette er en test";
            DateTime dt1 = DateTime.Now;
            for(int i = 0; i < N; i++)
            {
                s = Regex.Replace(s, "[^A-Za-z0-9]", "");
            }
            DateTime dt2 = DateTime.Now;
            Console.WriteLine(s);
            Console.WriteLine((dt2 - dt1).TotalSeconds);
        }
        public static void Test2()
        {
            string s = "Dette er en test";
            DateTime dt1 = DateTime.Now;
            for(int i = 0; i < N; i++)
            {
                s = Regex.Replace(s, "[^A-Za-z0-9]", "", RegexOptions.Compiled);
            }
            DateTime dt2 = DateTime.Now;
            Console.WriteLine(s);
            Console.WriteLine((dt2 - dt1).TotalSeconds);
        }
        public static void Test3()
        {
            string s = "Dette er en test";
            Regex re = new Regex("[^A-Za-z0-9]");
            DateTime dt1 = DateTime.Now;
            for(int i = 0; i < N; i++)
            {
                s = re.Replace(s, "");
            }
            DateTime dt2 = DateTime.Now;
            Console.WriteLine(s);
            Console.WriteLine((dt2 - dt1).TotalSeconds);
        }
        public static void Test4()
        {
            string s = "Dette er en test";
            Regex re = new Regex("[^A-Za-z0-9]", RegexOptions.Compiled);
            DateTime dt1 = DateTime.Now;
            for(int i = 0; i < N; i++)
            {
                s = re.Replace(s, "");
            }
            DateTime dt2 = DateTime.Now;
            Console.WriteLine(s);
            Console.WriteLine((dt2 - dt1).TotalSeconds);
        }
        public static void Main(string[] args)
        {
            Test1();
            Test2();
            Test3();
            Test4();
            Console.ReadKey();
        }
    }
}
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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