ASP.NET标记的Regex分析

本文关键字:Regex 分析 NET ASP | 更新日期: 2023-09-27 18:21:23

我有一个程序来解析各种文件格式,目的是找到可本地化的字符串(GetText)。我正在寻找一个正则表达式,它可以从特定的开始和结束标记中获得"TEXT TO TRANSLATE"。我有一个有效的正则表达式,但由于IsVisible调用,下面的示例破坏了它。

<mw:Translate runat="server" Visible='<%# IsVisible() %>'>
TEXT TO TRANSLATE
</mw:Translate>

到目前为止,这就是我所拥有的,但却被它卡住了……有什么帮助吗?我在//评论中描述了我错误地表达的意图。。。

(?s)                   //multiline flag
'<mw':Translate        //opening <mw:Translate> tag
(?:(?![^"']+'s*'>)+)   //match anything but > preceeded by " or ' 
                       //with any whitespace after it
(?:["']+'s*)'>         //match > preceeded by " or ' with any 
                       //whitespace after it
's*                    //match any whitespace 
                       //(for trimming any whitespace around the text)
(?<text>.*?)           //capturing group for the localizable text
's*                    //match any whitespace 
'</mw':Translate'>     //match closing tag

我的问题可能是在开头的标签。。。我试图匹配右括号>,只有当它前面是"或",后面没有空格或任何空格时…因为否则它要么像%>,要么不是有效的ASP.NET

第1版:在得出结论之前,请先阅读问题。这不是HTML,而是ASP.NET,任何HTML解析器都不可能很好地解析它。我还瞄准了一些非常具体的东西更正:人们似乎同意它可以用HtmlAgility包解析,但我并不真的想使用它,因为我真的不喜欢在一个简单的用例中依赖外部lib。

EDIT 2:mw:不能嵌套Translate。由于mw:Translate的编程方式,它根本无法编译。

第3版:编辑澄清。

编辑4:自动关闭mw:不允许翻译

编辑5:mw:Translate中的HTML与ASP.NET页面上的任何其他文本一样有效

编辑6:我自己回答说,我需要的正则表达式可能有点复杂(但不是因为与HTML有任何关系),请参阅下面的

ASP.NET标记的Regex分析

即使这是ASP.NET而不是HTML,您也可以使用HtmlAgilityPack来解析它。

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html); // html is the aspx document text
var translatableTextNodes = 
    doc.DocumentNode.SelectNodes("//text()[contains(., 'TEXT TO TRANSLATE')]");
foreach (var parent in translatableTextNodes)
    Console.WriteLine("Node:[{0}] Text:{1}",parent.Name, parent.InnerText);

输出一个包含一个包含TEXT TO TRANSLATE:的服务器控件的示例页

Node:[mw:translate] Text:
TEXT TO TRANSLATE

即使您修改了正则表达式。以下是的一些问题

  • 如果里面有其他标签,就不会工作(接下来不可能用regex解决这个问题)
  • asp.net可以有像<a href=''/>这样的自关闭标签

使用htmlagilitypack

您可以使用此代码使用HtmlAgilityPack 进行检索

HtmlDocument doc = new HtmlDocument();
doc.Load(yourStream);
var itemList = doc.DocumentNode.SelectNodes("//Translate")//this xpath selects all translate tag
                  .Select(p => p.InnerText)
                  .ToList();
//itemList now contain all the translate tags content

我会尝试匹配属性列表,假设一个属性用引号或单引号括起来
这是一个假设,不是所有HTML都正确,但它可能对你有用:

<mw:Translate       #opening <mw:Translate> tag
# Match attributes
(?:'s+'w+(?:'s*='s*(?:"[^"]*"|'[^']*'))?)*
's*
>                   #match >
's*
(?<text>.*?)        #capturing group for the localizable text
's*                 #match any whitespace 
</mw:Translate>     #match closing tag

工作示例:http://regexhero.net/tester/?id=5834b4f1-095b-4af6-a0da-d1fe119778bc