1

我正在尝试修复一个无法正常工作的正则表达式。

就像现在一样:<[^>]*(>|$)

当字符串如下时,该正则表达式有效:

<?UMBRACO_MACRO  macroalias="RelatedLinks"  PushCollection="Test123"  />

但我也需要它来匹配这个:

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

其中一个属性的内容在 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 now HtmlEncode the value before it is saved and then when I get it Idecode,然后它就可以工作了。

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 回答