1

正しく機能していない 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 し、それを取得したらデコードすると機能します。

4

2 に答える 2

1

私のコメントとΩmegaのコメントを拡張するには:

明らかに無効なデータ構造により、このタスクは不可能になります。あなたは、引用符の間のテキストを無視したいと言っています。原則としてこれで問題ありません(正規表現では非常に可能です)が、あなたの場合、引用されたテキストにはエスケープされていない引用符が含まれています。 これは、埋め込まれた文字列で実際に引用されているものは何でも二重引用符の外側になるという問題のある状況につながります! この点を説明するために、これは引用符で囲まれていない部分と引用された部分に分割された文字列です。

<?UMBRACO_MACRO  macroalias=
"RelatedLinks"
PushCollection=
"<links><link title="
test
" link="
1058
" type="
internal
" newwindow="
1
" /></links>"
/>

ソース データは、次のように少なくとも内側の引用符をエスケープする必要があります。

<?UMBRACO_MACRO  macroalias="RelatedLinks"  PushCollection="<links><link title=\"test\" link=\"1058\" type=\"internal\" newwindow=\"1\" /></links>"  />

そこを直さないと解析不能です。

XML パーサーを使用できるようにするには (それ以外の場合はこのタスクに最適です)、&quot;の代わりに文字エンティティが必要です\"

したがって、次のようにソース文字列を正しくエスケープすると (わかりやすくするために改行が追加されます):

<?UMBRACO_MACRO  macroalias="RelatedLinks"  
  PushCollection="&lt;links&gt;
  &lt;link title=&quot;test&quot; 
  link=&quot;1058&quot; 
  type=&quot;internal&quot; 
  newwindow=&quot;1&quot;
  /&gt;
  &lt;/links&gt;"  
/>

その後、元の正規表現を使用できます。

于 2012-11-25T09:05:41.320 に答える
0

http://txt2re.com/index-csharp.php3にプラグインして、そこから取得することができます

于 2012-11-25T00:37:57.153 に答える