2

I have a string that contains some random text plus 0 or more span tags.

Like this.

Hey <span class="OverLayStyle" style="background-color:#d8dfea">@Peter</span> and <span class="OverLayStyle" style="background-color:#d8dfea">@cara</span> 

Do you like <span class="OverLayStyle" style="background-color:#d8dfea">#Facebook</span>  or <span class="OverLayStyle" style="background-color:#d8dfea">#Google</span> ?

I would like to pull out the span tag that contains a @ and replace it with an a tag like this:

<span class="OverLayStyle" style="background-color:#d8dfea">@Peter</span>

TO:

<a href="" class="OverLayStyle" style="background-color:#d8dfea">@Peter</a>

Is it possible to do something like this?

Wesley Lomax
  • 2,067
  • 2
  • 20
  • 34

3 Answers3

3

You could do something like:

var line = @"
<span class=""OverLayStyle"" style=""background-color:#d8dfea"">@Peter</span>
<span class=""OverLayStyle"" style=""background-color:#d8dfea"">Peter</span>
<span class=""OverLayStyle"" style=""background-color:#d8dfea"">someone@example.com</span>
<span class=""OverLayStyle"" style=""background-color:#d8dfea"">@Peter</span>";

var replaced = Regex.Replace(
    line,
    "<span.*?>@+.*?</span>",
    match => match.Value
             .Replace("span ", "a href=\"\" ")
             .Replace("/span>", "/a>"));


Gives:
  <a href="" class="OverLayStyle" style="background-color:#d8dfea">@Peter</a>
  <span class="OverLayStyle" style="background-color:#d8dfea">Peter</span>
  <span class="OverLayStyle" style="background-color:#d8dfea">someone@example.com</span>
  <a href="" class="OverLayStyle" style="background-color:#d8dfea">@Peter</a>

This will only replace the span tag when it's content starts with @

Jeroen van Langen
  • 21,446
  • 3
  • 42
  • 57
2

You could try this:

    string s1="Hey <span class=\"OverLayStyle\" style=\"background-color:#d8dfea\">@Peter</span> and <span class=\"OverLayStyle\" style=\"background-color:#d8dfea\">@cara</span>";
    string s2 = "Do you like <span class=\"OverLayStyle\" style=\"background-color:#d8dfea\">#Facebook</span>  or <span class=\"OverLayStyle\" style=\"background-color:#d8dfea\">#Google</span> ?";

    var sb=new StringBuilder();

    var parts = s1.Split(new string[] { "</span>" },StringSplitOptions.RemoveEmptyEntries);
    foreach (var s in parts) {
        if (s.Contains('@'))
            sb.Append(s.Replace("<span ", "<a href=\"\" ") + "</a>");
        else
            sb.Append(s + "</span>"); 
    }

    var resultOfs1 = sb.ToString();
    /*
    Hey <a href="" class="OverLayStyle" style="background-color:#d8dfea">@Peter</a> and <a href="" class="OverLayStyle" style="background-color:#d8dfea">@cara</a> 
    */

    sb.Clear();

    parts = s2.Split(new string[] { "</span>" }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var s in parts) {
        if (s.Contains('@'))
            sb.Append(s.Replace("<span ", "<a href=\"\" ") + "</a>");
        else
            sb.Append(s + "</span>");
    }
    var resultOfs2 = sb.ToString();
    /*
    Do you like <span class="OverLayStyle" style="background-color:#d8dfea">#Facebook</span>  or <span class="OverLayStyle" style="background-color:#d8dfea">#Google</span> ?</span> 
    */
Shnugo
  • 66,100
  • 9
  • 53
  • 114
-1

Have you tried string.Replace? :

string v=yourString.Replace(@"<span",@"yourReplacement"); string v2=yourString.Replace(@"</span",@"yourReplacement");

To avoid any error you have to assign to a new string

Source: http://www.dotnetperls.com/replace

  • Does this as i said, look for those span tags that only contains a @ – Carsten Løvbo Andersen Oct 23 '15 at 08:04
  • It will replace the closing tag but you can put that in your replacement string. The problem is that you have to have a difference between what you want to replace then you would just replace span and get everywhere the same string. – Mihai-Daniel Virna Oct 23 '15 at 08:07