WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Stoppa in en Usercontrol mitt i en string (https://www.wn.se/forum/showthread.php?t=36132)

Osiris 2009-04-05 15:30

Jag har en sträng som jag vill kunna ha "stoppord" i. Om stoppordet finns vill jag dela upp strängen till delen före- och efter stoppordet.

Så här skulle det kunna se ut vid de tillfällen stoppordet finns:
Kod:

//C#
string htmlBody = "<h1>Karta</h1><!-- Karta-00001 --><p>Ovan kan du se en karta för...</p>";

Det jag vill ha är ett sätt att kolla om <!-- Karta- finns i strängen, om den gör det så ska hela kommentaren <!-- Karta-00001 --> plockas ut, texten före och efter kommentaren läggas i en array. Längden på kommentaren kommer att vara av en exakt längd när detta förväntas fungera.

Min tanke är att kunna byta ut kommentaren mot en usercontrol som innehåller kartan.

Tips eller kodexempel mottages tacksamt.

Jan Eriksson 2009-04-05 16:33

Nu kör jag vb.net men split borde du kunna använda.

http://www.homeandlearn.co.uk/net/nets7p7.html

Osiris 2009-04-05 17:03

Tror jag har löst det, eller åtminstone kommit förbi mitt största hinder.

Postar testkoden så om du har kommentarer att ge så...
RightBack/LeftBack returnerar SubString klippt antingen från vänster eller höger.

Kod:

protected void Page_Load(object sender, EventArgs e) {
        string htmlBody = "<h1>Karta</h1><!-- Karta-00000001 --><p>Ovan kan du se en karta för...</p>";

        StringBuilder sb = new StringBuilder();
        sb.Append(Server.HtmlEncode(htmlBody) + "<br />\n");
        sb.Append(CheckForMap(htmlBody).ToString() + "\n");
        sb.Append("<br />\n");
        sb.Append(returnMap(htmlBody));

        litOut.Text = sb.ToString();
 }

 protected bool CheckForMap(string input) {
        bool val = false;

        if (input.Contains("<!-- Karta-")) {
  val = true;
        }

        return val;
 }

 protected string returnMap(string input) {
        string retVal = string.Empty;

        Regex r = new Regex("(<!-- Karta-)");
        string[] s = r.Split(input);

        if (s[2] != null) {
  retVal = "<pre>" + wf.Util.RightBack(s[2], s[2].Length - 12) + "</pre>\n";

  //kollar kartans id
  retVal += "<br /><pre>Kartans id: " + wf.Util.LeftBack(s[2], 8) + "</pre>\n";
        }

        return retVal;
 }


Oskar Lindgren 2009-04-05 18:32

http://msdn.microsoft.com/en-us/library/fk49wtc1.aspx en oneliner..

Osiris 2009-04-05 18:53

Citat:

Originally posted by Oskar Lindgren@Apr 5 2009, 18:32
http://msdn.microsoft.com/en-us/library/fk49wtc1.aspx en oneliner..
Oskar, vilket problem löser Replace?

Jan Eriksson 2009-04-05 22:34

Detta tror jag löser ditt problem. Du får det i vb.net men du fixar nog detta.

Citat:



Dim PatternString As String
PatternString = "(?<1>[^\]]+?)<!-- Karta-(?<2>[^\]]+?) -->(?<3>.+)"

Dim r As Regex = New Regex(PatternString)

Dim m As Match

m = r.Match(htmlBody)

If m.Success Then
Dummy1 = Trim(m.Groups(1).ToString) 'Innhåller <h1>Karta</h1>
Dummy2 = Trim(m.Groups(2).ToString) 'Innhåller 00000001
Dummy3 = Trim(m.Groups(3).ToString) 'Innhåller

Ovan kan du se en karta för...</p>";
Else
Dummy0 = "Här händer det som ska hända när inte Karta finns med"
End If


martine 2009-04-06 09:37

Regexp är konstruerat för just den här typen av problem - gör ett regexp-replace hur det nu kan tänkas se ut i ditt språk.

Jan Eriksson 2009-04-06 09:52

Citat:

Originally posted by martine@Apr 6 2009, 08:37

Regexp är konstruerat för just den här typen av problem - gör ett regexp-replace hur det nu kan tänkas se ut i ditt språk.

Det går väl knappast att göra en replace på textsträngen och få in en usercontrol i den? Om det går så får du gärna visa så man lär sig något nytt. :)

Onkelborg 2009-04-06 18:37

Det går, man använder delegater. Skickar in en delegate, dvs. en pekare på en funktion, istället för en textsträng. Man kan plocka alla delarna i matchningen i realtid och ersätta texten, hur smidigt som helst. Och med anonyma delegater blir koden riktigt fin :)

Jan Eriksson 2009-04-07 09:02

Citat:

Originally posted by Onkelborg@Apr 6 2009, 17:37
Det går, man använder delegater. Skickar in en delegate, dvs. en pekare på en funktion, istället för en textsträng. Man kan plocka alla delarna i matchningen i realtid och ersätta texten, hur smidigt som helst. Och med anonyma delegater blir koden riktigt fin

Det måste vi titta på. Alltid kul med nya saker. :)


Alla tider är GMT +2. Klockan är nu 19:53.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson