erstatte tags med html indhold

I dette forum kan du stille og svare på spørgsmål om C# programmering. Alle med en interesse for C# er velkommen!
Besvar
tobrukdk
Nørd
Nørd
Indlæg:120
Tilmeldt:18. dec 2011, 00:40
erstatte tags med html indhold

Indlæg af tobrukdk » 26. maj 2018, 00:20

Hvis jeg fx skriver {{help}} i min content indhold så skal du hente {{help}} elementer over i blocks tablen. Det vil sige hvis jeg skriver {{help}} så skal du frem skrive det indhold som den har værdi. altså den html værdi som {{help}} har.

i listBlocks.Tag det kan fx være {{help}} som bare skrive omskrives til det html indhold som står skrevet i value. Den value som man har skrevet der skal så bare tilføj det html indhold over på den plads hvor man fx har skrevet {{help}}

Fx {{help}} kan indeholde en alert eller noget helt andet som skal blive vist på flere sider.

Kode: Vælg alt

var listBlocks = _dbContext.Blocks.ToList();//{{banner}} here
            var text = _dbContext.ContentInfo.FirstOrDefault(i => i.Id == GetId).ContentText;//text content

            for (int i = 0; i < listBlocks.Count; i++)
            {
                if (listBlocks[i].Tag.Equals(text))
                {
                    text += text.Replace(listBlocks[i].Tag, listBlocks[i].Value);
                }
                //How can I do this?
            }

jepperask
Geni
Geni
Indlæg:378
Tilmeldt:4. nov 2012, 17:57

Re: erstatte tags med html indhold

Indlæg af jepperask » 27. maj 2018, 19:53

Jeg har lidt svært ved at forstå din beskrivelse.

Er Blocks HTML-elementer, som f.eks et banner, hvor ContentInfo er en konkret tekstformidling?

Kan du prøve at omformulere hvad du prøver at opnå og evt. give et eksempel?

tobrukdk
Nørd
Nørd
Indlæg:120
Tilmeldt:18. dec 2011, 00:40

Re: erstatte tags med html indhold

Indlæg af tobrukdk » 27. maj 2018, 20:29

Hvis det er sådan, at jeg skriver {{helpdanger}} så skal den fremvise en alert som jeg har i databasen blocks. Det kunne fx være:

Kode: Vælg alt

<div class="alert alert-danger">
  <strong>Danger!</strong> Error bla bla bla....
</div>
eller hvis jeg skriver {{videoIntro}} så skal den så vise en youtube video frem.

Det som jeg tro problemet er lige pt det er, at kode samligner hele teksten med det tag som jeg søger efter.

jepperask
Geni
Geni
Indlæg:378
Tilmeldt:4. nov 2012, 17:57

Re: erstatte tags med html indhold

Indlæg af jepperask » 27. maj 2018, 20:50

Så du har en streng, hvor der et tilfældigt sted står {{key}}, og key repræsenterer et form for unikt ID som du vil erstatte med den tilsvarende value?
I det tilfælde ville jeg overveje at benytte regex, f.eks: "{{[a-zA-Z0-9]*}}". Den vil så matche på alle forekomster af "{{" efterfulgt af en sekvens af 0-eller-flere bogstaver eller tal (kan udvides) og til sidst afsluttet af "}}".

Men med det antager jeg at du arbejder med en streng - så at du f.eks har hele dit content i databasen.
Hvis det ikke er tilfældet, og du har en .cshtml-fil, så kan du bare få razor til at indsætte din tekst direkte.

jepperask
Geni
Geni
Indlæg:378
Tilmeldt:4. nov 2012, 17:57

Re: erstatte tags med html indhold

Indlæg af jepperask » 27. maj 2018, 21:06

Et simpelt code-snippet:

Kode: Vælg alt

public class Program
    {
        static string Trim(string input)
        {
            input = input.Replace("{", "");
            input = input.Replace("}", "");
            return input;
        }
        
        static void Main(string[] args)
        {
            var collection = new Dictionary<string, string>();
            collection["video-player"] = "<p>Video Player</p>";
            
            
            var input = "<div>{{video-player}}</div>";
            Console.WriteLine($"Input before: {input}");

            MatchCollection matches = Regex.Matches(input, "{{[a-zA-Z0-9-]*}}");

            foreach (Match match in matches)
            {
                input = input.Replace(match.Value, collection[Trim(match.Value)]);
            }
            
            Console.WriteLine($"Input after: {input}");
        }
    }
Printer:
Input before: <div>{{video-player}}</div>
Input after: <div><p>Video Player</p></div>

Jeg har bare lavet det med en simpel dictionary, så du burde kunne erstatte med dine Context-kald.

tobrukdk
Nørd
Nørd
Indlæg:120
Tilmeldt:18. dec 2011, 00:40

Re: erstatte tags med html indhold

Indlæg af tobrukdk » 27. maj 2018, 21:59

Hej igen. Men lad også sige, at der er en masse contenttext indhold fx

Kode: Vælg alt

<p>hej hej hej</p>
<p>hej hej hej</p>
<p>hej hej hej</p>
<p>hej hej hej</p>
<p>{{video}}</p>
<p>hej hej hej</p>
<p>hej hej hej</p>
<p>hej hej hej</p>
<p>{{alert}}</p>
Så, at den kun skal tag de to punkt med det tag på sig?

jepperask
Geni
Geni
Indlæg:378
Tilmeldt:4. nov 2012, 17:57

Re: erstatte tags med html indhold

Indlæg af jepperask » 27. maj 2018, 22:11

tobrukdk skrev:Hej igen. Men lad også sige, at der er en masse contenttext indhold fx

Kode: Vælg alt

<p>hej hej hej</p>
<p>hej hej hej</p>
<p>hej hej hej</p>
<p>hej hej hej</p>
<p>{{video}}</p>
<p>hej hej hej</p>
<p>hej hej hej</p>
<p>hej hej hej</p>
<p>{{alert}}</p>
Så, at den kun skal tag de to punkt med det tag på sig?
Jeg forstår ikke helt hvad du mener. Vil du eksplicit fortælle den hvilke tags den skal erstatte, eller bare lade den slå de tags op i databasen som den finder?
Hvis jeg kører med din streng, bliver input ændret sådan her:
Input before: <p>hej hej hej</p><p>hej hej hej</p><p>hej hej hej</p><p>hej hej hej</p><p>{{video}}</p><p>hej hej hej</p><p>hej hej hej</p><p>hej hej hej</p><p>{{alert}}</p>
Input after: <p>hej hej hej</p><p>hej hej hej</p><p>hej hej hej</p><p>hej hej hej</p><p><p>Video Player</p></p><p>hej hej hej</p><p>hej hej hej</p><p>hej hej hej</p><p><p>Alert!</p></p>

Kode: Vælg alt

public class Program
    {
        static string Trim(string input)
        {
            input = input.Replace("{", "");
            input = input.Replace("}", "");
            return input;
        }
        
        static void Main(string[] args)
        {
            // 
            var collection = new Dictionary<string, string>();
            collection["video"] = "<p>Video Player</p>";
            collection["alert"] = "<p>Alert!</p>";
            
            
//            var input = "<div>{{video-player}}</div>";
            var input = "<p>hej hej hej</p><p>hej hej hej</p><p>hej hej hej</p><p>hej hej hej</p><p>{{video}}</p><p>hej hej hej</p><p>hej hej hej</p><p>hej hej hej</p><p>{{alert}}</p>";
            Console.WriteLine($"Input before: {input}");

            MatchCollection matches = Regex.Matches(input, "{{[a-zA-Z0-9-]*}}");

            foreach (Match match in matches)
            {
                input = input.Replace(match.Value, collection[Trim(match.Value)]);
            }
            
            Console.WriteLine($"Input after: {input}");
        }
    }

tobrukdk
Nørd
Nørd
Indlæg:120
Tilmeldt:18. dec 2011, 00:40

Re: erstatte tags med html indhold

Indlæg af tobrukdk » 5. jun 2018, 21:59

Jeg fik løst det ved at skrive det sådan her:

Kode: Vælg alt

var listBlocks = _dbContext.Blocks.ToList();//{{banner}} here
            var text = _dbContext.ContentInfo.FirstOrDefault(i => i.Id == GetId).ContentText;//text content

            Regex regEx = new Regex(@"{{\w*}}");
            MatchCollection rows = regEx.Matches(text);
            foreach (Match row in rows)
            {
                var block = listBlocks.FirstOrDefault(ib => ib.Tag == row.Value);
                if (block != null)
                {
                    text = text.Replace(row.Value, block.Value);
                }
            }

Besvar