正しく機能していない 1 つの正規表現を修正しようとしています。
現在のように:<[^>]*(>|$)
その正規表現は、文字列が次の場合に機能します。
<?UMBRACO_MACRO macroalias="RelatedLinks" PushCollection="Test123" />
しかし、これも一致させる必要があります:
<?UMBRACO_MACRO macroalias="RelatedLinksPresentation" PushCollection="<links><link title="test" link="1058" type="internal" newwindow="1" /></links>" />
ここで、1 つのプロパティのコンテンツは xml にあります。
そのxml値は3つのグループを生成します...
編集:
コードは次のようになります。
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
...........
Regex tagregex = new Regex("<[^>]*(>|$)", RegexOptions.Singleline | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
MatchCollection tags = tagregex.Matches(_data.Value.ToString());
List<int> editornumbers = new List<int>();
string sortorder = string.Empty;
for (int i = 0; i < _maxNumber; i++)
{
if (!editornumbers.Contains(i))
{
string data = string.Empty;
if (tags.Count > i)
data = tags[i].Value;
MacroEditor macroEditor = new MacroEditor(data, _allowedMacros);
macroEditor.ID = ID + "macroeditor_" + i;
this.ContentTemplateContainer.Controls.Add(macroEditor);
}
}
this.ContentTemplateContainer.Controls.Add(new LiteralControl("</div>"));
if (tags.Count == _maxNumber)
{
_addMacro.Enabled = false;
_limit.Visible = true;
}
MacroContainerEvent.Execute += new MacroContainerEvent.ExecuteHandler(MacroContainerEvent_Execute);
}
彼らがそのようにした理由を私は知っています。値はデータベースから取得されるため、解析する必要があり、そのような複数の文字列が含まれる場合があります。たとえば、
<?UMBRACO_MACRO macroalias="RelatedLinks" PushCollection="Test123" />
<?UMBRACO_MACRO macroalias="RelatedLinks" PushCollection="<links><link title="test" link="1058" type="internal" newwindow="1" /></links>" />
<?UMBRACO_MACRO macroalias="RelatedLinks" PushCollection="Test123" />
<?UMBRACO_MACRO macroalias="RelatedLinks" PushCollection="Test123" />
これは 4 つのマクロであり、正規表現はそれらを個別のインスタンスに分割するように作成されています。
明確にするために、これは xml ではなく、フレームワーク Umbraco がプロパティから値を取り出すパターンです。今回はたまたま値が xml で、UMBRACO_MACRO 文字列を区切る必要がある正規表現がびっくりしました。
編集:問題は、 "" <-間のすべてを無視する方法です。値フィールド内の内容を正規表現に気にさせたくないのですが、それは可能ですか?
私はこれを行うのが難しすぎると感じましたが、別の道を歩むことを見つけました:DI 保存する前に値を HtmlEncode し、それを取得したらデコードすると機能します。