1

ユーザーが CMS のコンテンツの特定のセクションを追加の「タグ」で「マーク」できるようにしようとしています。これは、コンテンツがページにレンダリングされるときに、たとえば太字などに翻訳されます。

{strong:Lorum ipsum dolar}テキストが でラップされる場所のようなもの<strong>Lorum ipsum dolar</strong>

私はこれの正規表現を理解しようとしましたが、うまくいきません。サイトからいくつかの html 置換スクリプトを取得しましたが、それらはあまり役に立ちません。少なくとも、何を変更すればよいかわかりません:$。

どんな助けでも大歓迎です。

ノート

私はC#でこれをやっています。

4

3 に答える 3

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 または使用する出力言語に戻すことです。

于 2012-05-11T22:26:34.020 に答える
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());
}  
于 2012-05-12T01:08:01.053 に答える
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>
于 2012-05-11T22:15:32.643 に答える