views:

396

answers:

3

I have HTML data which I'll be using in a client app. I need to Regex.Replace the <a> tags from

<a href="Bahai.aspx">Bahai</a>

to

<a href="#" onclick="process('Bahai.aspx');return false;">Bahai</a>

In C# using RegExReplace with a regex similar to

<a[^>]*? href=\"(?<url>[^\"]+)\"[^>]*?>(?<text>.*?)</a>

Ideas?

+1  A: 

In general, it's best not to parse HTML with regular expressions. Try the Html Agility Pack instead.

TrueWill
A: 

If you insist on using javascript to get people to visit Bahai.aspx, then people without javascript won't get there. Could you use javascript to do the rewrite instead, for instance in jquery?

Let's say you tag the anchor tags with class="doProcess" then you could use the following jQuery script to change the links:

$(document).ready(function(){
  $('a.doProcess').each(function(){
    var a = $(this);
    var href = a.attr('href');
    a.attr('href','#');
    a.click(function(){
      process(href);
      return false;
    });
  });
});

then both the users with javascript and without will get sent to Bahai (if that is what your process method does) :)

AndreasKnudsen
+2  A: 

In C# you could use code like this:

Regex.Replace("<a href=\"Bahai.aspx\">Bahai</a>", 
            "<a href=\"(.+?)\">(.+?)</a>", "<a href=\"#\" onclick=\"process('$1');return false;>$2</a>",
            RegexOptions.IgnoreCase);

It will return a string that matches what you require.

Alan
JavaScript is case-sensitive. `Process` is not the same as `process`. You also don’t need the label `javascript`.
Gumbo
I agree with you, I'd just copy pasted from the question which has now changed :-) The RegexOptions.IgnoreCase is used to ignore the case of the input string, so this will work with <A HREF... and <a href...
Alan