1

我有一个程序来解析各种文件格式,目标是找到可本地化的字符串(GetText 差不多)。我正在寻找一个正则表达式,它可以从特定的开始和结束标签中获得“要翻译的文本”。由于 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 包解析,但我真的不想使用它,因为我真的不喜欢在一个简单的用例中依赖外部库。

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

编辑3:澄清编辑。

编辑 4: 自动关闭 mw:translate 是不允许的

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

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

4

3 回答 3

3

即使这是 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
于 2013-07-08T11:13:52.750 回答
1

即使你修改你的正则表达式。这里有一些问题

  • 如果里面有其他标签将不起作用(几乎不可能用正则表达式解决这个问题)
  • 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
于 2013-07-08T11:12:28.040 回答
0

我会尝试匹配属性列表,假设属性用引号或单引号括起来。
这是一个不适用于所有 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

于 2013-07-08T11:11:38.117 回答