Darkloki
Darkloki

Reputation: 686

Regex pattern BBCode to Wiki Notation, C#

I am tasked with converting BB code to WIKI notation and thanx to the many examples on SO I have cracked most of the tougher nuts. This is my first foray into Regex and I'm trying to learn it as I go (I would prefer stringbuilder but it doesnt seem to work with BB code). I have 4 items I need replaced that I cannot seem to create the proper pattern to identify: (original string on left, what I need on right after double dash)

enter image description here

the first item is a problem child because the wiki engine adds a new line where the spaces are. It is not a separate field but part of a larger string so I cant TRIM() it. I am currently using

result = result.Replace("[b]", "*").Replace("[/b]", "*");

the img issue is a need to somehow include the attributes if possible in the given format.

for the last 2 I am stumped. I have used

Regex r = new Regex(@"<a .*?href=['""](.+?)['""].*?>(.+?)</a>");
        foreach (var match in r.Matches(multistring).Cast<Match>().OrderByDescending(m => m.Index))
        {
            string href = match.Groups[1].Value;
            string txt = match.Groups[2].Value;
            string wikilink = "[" + txt + "|" + href + "]";
            sb.Remove(match.Groups[2].Index, match.Groups[2].Length);
            sb.Insert(match.Groups[2].Index, wikilink);
        }

in the past for HTML but cant seem to refactor it for my current needs. Suggestions, links to resources, all would be appreciated.

EDIT solved the img issue, though it's not pretty and I still risk removing a closing [/img] tag that may not be caught earlier. The [img] code is fairly consistent, so I used:

                Regex imgparser = new Regex(@"\[img[^\]]*\]([^\[]*)");
                foreach (var itag in imgparser.Matches(multistring).Cast<Match>().OrderByDescending(m => m.Index))
                {
                    string isrc = itag.Groups[1].Value;
                    string wikipic = itag.ToString().Replace("[img ", "!" + isrc).Replace("width=", "!width=").Replace("height=", ",height=").Replace("]" + isrc, string.Empty);
                    result = result.Replace(itag.ToString(), wikipic);
                }
                result = result.Replace("[/img]", "!");

Upvotes: 0

Views: 369

Answers (1)

Quentin Roger
Quentin Roger

Reputation: 6538

I can give you a little example for the last case :

 string str1 = "[url=http://aadqsdqsd]link[/url]";
 var pattern = @"^\[url=(.*)\](.*)\[\/url\]$";
 var match = Regex.Match(str1, pattern);
 var result = string.Format("[{0}| {1}]", match.Groups[2].Value, match.Groups[1].Value);
 //[link| http://aadqsdqsd]

Is it what you want ?

EDIT

if you want to match a larger string you can do :

    var strTomatch = "[url=http://1]link1[/url][url=http://2]link2[/url]" + Environment.NewLine +
                     "[url = http://3]link3[/url]" + Environment.NewLine +
                     "[url=http://4]link4[/url]";

    var match = Regex.Match(strTomatch, @"\[url\s*=\s*(.*?)\](.*?)\[\/url\]", RegexOptions.Multiline);
    while (match.Success)
    {
        var result = string.Format("[{0}| {1}]", match.Groups[2].Value, match.Groups[1].Value);
        Debug.WriteLine(result);
        match = match.NextMatch();
    }

Output

[link1| http://1]
[link2| http://2]
[link3| http://3]
[link4| http://4]

Upvotes: 1

Related Questions