【问题标题】:Find/parse server-side <?abc?>-like tags in html document在 html 文档中查找/解析服务器端类似 <?abc?> 的标签
【发布时间】:2010-12-22 06:23:06
【问题描述】:

我想我需要一些正则表达式的帮助。我想找到像&lt;?abc?&gt; 这样的所有标签,这样我就可以用里面运行的代码的任何结果来替换它。我只需要帮助正则表达式标签/代码字符串,而不是解析里面的代码:p.

&lt;b&gt;&lt;?abc print 'test' ?&gt;&lt;/b&gt; 将导致&lt;b&gt;test&lt;/b&gt;

编辑:不具体但一般来说,匹配(&lt;?[chars] (code group) ?&gt;)

【问题讨论】:

  • 你的意思是它总是有一个 print 'something' 并且你想用 'something' 替换整个 ?
  • 我不是 C# 专家,但这个概念应该像这样工作。使用某种搜索/查找功能查找 。从那里,使用第一个位置的子字符串函数作为位置和位置 2 之间的长度,您的结果将是在“打印''”标签中找到的。
  • 我想要我自己的 类型的标签,我可以找到它并将代码内容分组到其中。 (&lt;?php(code group)?&gt;)

标签: c# html regex


【解决方案1】:

这将构建字符串source 的新副本,将&lt;?abc code?&gt; 替换为process(code) 的结果

Regex abcTagRegex = new Regex(@"\<\?abc(?<code>.*?)\?>");

StringBuilder newSource = new StringBuilder();
int curPos = 0;

foreach (Match abcTagMatch in abcTagRegex.Matches(source)) {
    string code = abcTagMatch.Groups["code"].Value;
    string result = process(code);

    newSource.Append(source.Substring(curPos, abcTagMatch.Index));
    newSource.Append(result);
    curPos = abcTagMatch.Index + abcTagMatch.Length;
}

newSource.Append(source.Substring(curPos));
source = newSource.ToString();

注意我无法测试此代码,因此某些函数可能名称略有错误,或者可能存在一些错误。

【讨论】:

  • 我通常不会提倡使用.*?,但我能想到的所有匹配“这一系列字符的所有内容”的替代方法都过于复杂和混乱。
  • 我什么都想要!但是很少!呵呵
  • 如果我只是输出了代码组,&lt;?abc echo '?&gt;'; ?&gt; 的结果似乎是 echo ''; ?&gt;。您还错过了倒数第二行的括号。不过这是一个好的开始,我想我知道的足以解决这个错误。
【解决方案2】:
var new Regex(@"<\?(\w+) (\w+) (.+?)\?>")

这将采用这个来源

<b><?abc print 'test' ?></b>

然后像这样分解它:

Value: <?abc print 'test' ?>

    SubMatch: abc
    SubMatch: print
    SubMatch: 'test' 

然后可以将这些发送到一个方法,该方法可以根据部件的不同进行不同的处理。

如果您需要更高级的语法处理,我相信您需要超越正则表达式。

我使用Antlr 设计了一个模板引擎,但这要复杂得多;)

【讨论】:

    【解决方案3】:
    exp = new Regex(@"<\?abc print'(.+)' \?>");
    str = exp.Replace(str, "$1")
    

    这样的事情应该可以解决问题。更改您认为合适的正则表达式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2011-07-10
      • 2021-02-05
      相关资源
      最近更新 更多