1

The example of string:

Contrary to popular belief, <a href"mycompany/product/detail.aspx?mId=3">Lorem</a> Ipsum is not simply random text. It has roots in a piece of classical <a href"mycompany/product/detail.aspx?mId=25">Latin</a> literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin <a href"mycompany/product/detail.aspx?mId=61">professor</a> at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.

There are multiple links in the string, what I'd like to do is replace the link one by one based on the id in that link. e.g.

for the link, <a href"mycompany/product/detail.aspx?mId=3"> I'd like to replace it with, <a href"mycompany/detailView.aspx?pId=3">

How can I do it?

Thank you in advance!

Tim Rogers
  • 21,297
  • 6
  • 52
  • 68
Smallville
  • 685
  • 4
  • 13
  • 24

2 Answers2

2

EDIT: To replace all IDs use this approach:

string pattern = @"(?<=<a[^>]+href=""mycompany/)product/detail\.aspx\?mId=(?<Id>\d+)(?="">)";
string replace = "detailView.aspx?pId=${Id}";
string result = Regex.Replace(input, pattern, replace);

The pattern uses a named group called Id which captures one or more digits (\d+). It is then referenced in the replacement pattern (i.e., replace). Look-arounds are used to match the general URL pattern but not capture it, allowing the focus to be on just the portion to be altered.


Original answers to change specific IDs...

To replace a single ID you could use this approach:

string targetId = "3";
string pattern = @"(?<=<a[^>]+href=""mycompany/)product/detail\.aspx\?mId=(?<Id>"
                 + targetId + @")(?="">)";
string replace = "detailView.aspx?pId=${Id}";
string result = Regex.Replace(input, pattern, replace);

With a little extra effort the above can be modified to support multiple target IDs:

string[] targetIds = { "3", "61" };
string pattern = @"(?<=<a[^>]+href=""mycompany/)product/detail\.aspx\?mId=(?<Id>"
                 + String.Join("|", targetIds)
                 + @")(?="">)";
string replace = "detailView.aspx?pId=${Id}";
string result = Regex.Replace(input, pattern, replace);

This works fine for numbers as IDs, but if you plan to extend this to general strings you'll want to make use of the Regex.Escape method before joining all the target items as I've done above.

Ahmad Mageed
  • 94,561
  • 19
  • 163
  • 174
  • An example of escaping the strings and joining them can be seen in [my answer](http://stackoverflow.com/questions/2484919/how-do-i-split-a-string-by-strings-and-include-the-delimiters-using-net/2485044#2485044) to another question. – Ahmad Mageed May 13 '11 at 16:04
  • Thanks for your reply Ahmad. My problem to use your solution is the targetId is unknow. I don't know what the Id would be, so I have to dynamicly get it and replace it with another URL with this id. – Smallville May 17 '11 at 03:29
  • @Smallville that's easily done. See the edit at the top of my post. – Ahmad Mageed May 17 '11 at 13:01
1

Try something like this:

public string ReplaceString(string text) //Where text = the paragraph
{
     //New Text
     string newText = "<a href\"mycompany/detailView.aspx?pId=3\">";
     //Old text
     string oldText = "<a href\"mycompany/product/detail.aspx?mId=3\">";
     //String builder to replace text
     StringBuilder newString = new StringBuilder(text);
     //Replace text
     newString.Replace(oldText, newText);
     //Return
     return newString.toString();
}

I haven't tested it so you may need to fiddle around with the code. Also you can look here for more information on StringBuilder

Soatl
  • 10,224
  • 28
  • 95
  • 153