2016-09-19 1 views
0

Je suis chargé de convertir le code BB en notation WIKI et merci aux nombreux exemples sur SO J'ai craqué la plupart des écrous plus résistants. Ceci est ma première incursion dans Regex et j'essaie de l'apprendre comme je vais (je préférerais stringbuilder mais il ne semble pas fonctionner avec le code BB). J'ai 4 articles que je besoin remplacé que je ne peux pas sembler créer le modèle approprié pour identifier: (chaîne d'origine sur la gauche, ce que je dois à droite après double tiret)Modèle Regex BBCode à la notation Wiki, C#

enter image description here

le premier élément est un Problème enfant car le moteur wiki ajoute une nouvelle ligne où les espaces sont. Ce n'est pas un champ séparé mais une partie d'une chaîne plus grande, donc je ne peux pas TRIM(). J'utilise actuellement

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

le problème img est un besoin d'inclure en quelque sorte les attributs dans le format donné.

pour les 2 derniers je suis perplexe. Je l'ai utilisé

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); 
     } 

dans le passé pour HTML, mais ne peux pas sembler factoriser pour mes besoins actuels. Suggestions, liens vers des ressources, tous seraient appréciés.

EDIT résolu le problème img, mais ce n'est pas assez et je risque encore enlever une balise de fermeture [/ img] qui ne peut pas être pris plus tôt. Le [img] code est assez cohérent, donc j'utilisé:

   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]", "!"); 
+0

3) [ '\ [url = (mailto: [^]] *)]. *? \ [/ url] '->' [$ 1] '] (http://regexstorm.net/tester?p=%5c%5burl%3d (mailto% 3a% 5b% 5e% 5d% 5d *)% 5d. *% 3f% 5c% 5b% 2furl% 5d & i =% 5bb% 5dRaynor + Schein ++% 5b% 2fb % 5d% 0d% 0a% 5bimg + largeur% 3d130 + hauteur% 3d30% 5datt6387% 5b% 2fimg% 5d% 0d% 0a% 5burl% 3dmailto% 3amc% 23example.com% 5dmc% 40example.com% 5b% 2furl% 5d % 0d% 0a% 5burl% 3dhttp% 3a% 2f% 2fwww.exemple.com% 2f% 5dmy + lien + texte% 5b% 2furl% 5d & r =% 5b% 241% 5d). 4) '\ [url = (http [^]] *)] (. *?) \ [/ Url]' -> '[$ 2 | $ 1]'. –

Répondre

1

Je peux vous donner un petit exemple pour le dernier cas:

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] 

Est-ce que vous voulez?

EDIT

si vous voulez faire correspondre une chaîne plus grande que vous pouvez faire:

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(); 
    } 

Sortie

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

merci pour la réponse. le motif capture vraiment ce que je veux. Est-il possible d'ajouter une ou plusieurs jokers au début et à la fin du motif regex? la str1 dans ce cas fait partie d'une chaîne plus grande et ne correspond à rien s'il y a des caractères avant et/ou après le paramètre string. juste essayer de comprendre, merci d'avance – Darkloki