我试图让用户能够标记" CMS中的某些内容部分带有一些额外的标签'如果你愿意,那么当内容在页面上呈现时,它将被翻译,例如,粗体。
类似于{strong:Lorum ipsum dolar}
的内容,然后文本会被<strong>Lorum ipsum dolar</strong>
包裹。
我试图为此制作正则表达式,但我没有好处。我从网站上抓取了一些html替换脚本,因为它们不是很有帮助,至少,我不知道要改变什么:$。
任何帮助都将不胜感激。
注意
我在C#中这样做。
答案 0 :(得分:1)
这看起来很像jSon到XML的转换。
{"strong":"Lorum ipsum dolar"}
会变成
<strong>Lorum ipsum dolar</strong>
和
{"strong":{italic:"Lorum ipsum dolar"}}
会变成
<strong>
<italic>Lorum ipsum dolar</italic>
</strong>
我不是说这就是答案,但你可能想看一下。基本思想是将您的标记解析为分层结构,然后将其解析回HTML或您使用的任何输出语言。
答案 1 :(得分:1)
因此,这将为您提供您正在寻找的标签和部件,但是,我将这些结果转换为最终字符串的方式非常难看。它真的只是最重要的正则表达式。享受!
string test = "{strong:lorem ip{i:su{b:m}m}m dolar} {strong:so strong}";
Regex tagParse = new Regex(
@"\{(?<outerTag>\w*)
(?>
(?<DEPTH>\{(?<innerTags>\w*))
|
(?<-DEPTH>\})
|
:?(?<innerContent>[^\{\}]*)
)*
(?(DEPTH)(?!))
", RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline);
MatchCollection matches = tagParse.Matches(test);
foreach (Match m in matches)
{
StringBuilder sb = new StringBuilder();
List<string> tags = new List<string>();
tags.Add(m.Groups["outerTag"].Value);
foreach (Capture c in m.Groups["innerTags"].Captures)
tags.Add(c.Value);
List<string> content = new List<string>();
foreach (Capture c in m.Groups["innerContent"].Captures)
content.Add(c.Value);
if (tags.Count > 1)
{
for (int i = 0; i < content.Count; i++)
{
if (i >= tags.Count)
sb.Append("</" + tags[tags.Count - (i - tags.Count + 1)] + ">");
else
sb.Append("<" + tags[i] + ">");
sb.Append(content[i]);
}
sb.Append("</" + tags[1] + ">");
}
else
{
sb.Append("<" + tags[0] + ">");
sb.Append(content[0]);
}
sb.Append(m.Groups["outerContent"].Value);
sb.Append("</" + m.Groups["outerTag"].Value + ">");
Console.WriteLine(sb.ToString());
}
答案 2 :(得分:0)
编辑:要使用嵌套代码,请为每个输入字符串添加多个匹配项。 限制:标记对内的文本不能包含“{”或“}”。
private string FormatInput(string input)
{
const string patternNonGreedy = @"\{(?<tag>.+?):(\s*)(?<content>.*?)(\s*)}";
const string patternGreedy = @"\{(?<tag>.+?):(\s*)(?<content>.*)(\s*)}";
Match mtc = Regex.Match(input, patternGreedy);
if (!mtc.Success)
return input;
string content = mtc.Groups["content"].Value;
int braces = 0;
foreach (char c in content)
{
if (c == '{')
braces++;
else if (c == '}')
{
if (braces > 0)
braces--;
}
}
if (braces == 0)
return input.Substring(0, mtc.Index)
+ string.Format("<{0}>{1}</{0}>", mtc.Groups["tag"].Value, FormatInput(content))
+ input.Substring(mtc.Index + mtc.Length);
mtc = Regex.Match(input, patternNonGreedy);
Debug.Assert(mtc.Success);
content = mtc.Groups["content"].Value;
return input.Substring(0, mtc.Index)
+ string.Format("<{0}>{1}</{0}>", mtc.Groups["tag"].Value, content)
+ FormatInput(input.Substring(mtc.Index + mtc.Length));
}
测试示例:
string output1 = FormatInput("{strong:Lorum ipsum dolar}");
// output1: <strong>Lorum ipsum dolar</strong>
string output2 = FormatInput("{strong:{italic:Lorum ipsum dolar}}");
// output2: <strong><italic>Lorum ipsum dolar</italic></strong>
string output3 = FormatInput("{strong:Lor{i:e}m ipsum dol{i:o}r}");
// output3: <strong>Lor<i>e</i>m ipsum dol<i>o</i>r</strong>