【问题标题】:How to fetch all comments of PHP files using C#?如何使用 C# 获取 PHP 文件的所有注释?
【发布时间】:2013-06-13 03:07:06
【问题描述】:

我需要在 C# 中解析 PHP 文件。基本上我需要 PHP 文件中的所有 cmets,并且我想使用 Google Translate 将所有这些 cmets 翻译成另一种语言。

我目前正在使用正则表达式来执行此操作。但这是徒劳的。如果我解析“// 或 /../”,我无法确定这两个是否位于字符串中。

假设$i= " http://wwww.google.como " ;。我的正则表达式将其视为 cmets "//wwww.google.com " ;,而它不是注释。那么有人可以帮帮我吗?

是否已经构建了对我有很大帮助的东西,例如 php 解析器等?

【问题讨论】:

  • 必须是C#代码,还是可以接受其他语言的产品/解决方案?
  • 我在 .net 中需要它。但是如果我答应了,你会给我什么建议?
  • PHP 的词法结构相当复杂;检查字符串文字,然后当然可以在 PHP 中包含 HTML 文本,在最坏的情况下可能包含看起来像 PHP 代码的内容。除非你想写一个完整的 PHP 词法分析器,否则你很可能会弄错,你最终会在一些奇怪的文档字符串中找到“//”。此处的另一个答案建议使用 PHP 本身(包含完整的标记器)来完成这项工作;我认为这种方法是你最好的选择。

标签: c# php regex parsing


【解决方案1】:

创建一个简单的 php 脚本,它接受一个 php 脚本文件名并使用 token_get_all() 为您标记它

之后使用该输出(这是一个令牌流并且易于处理)

【讨论】:

    【解决方案2】:

    您可以使用一系列状态来代替正则表达式。例如(这是伪代码,您可以将其转换为您想要的任何语言):

    布尔 isPHP = false bool isMultiComment = false 布尔 isSingleComment = false bool isSingleQuote = false bool isDoubleQuote = false 字符串 cmets[] for i := 0 -> phpcode.length() 如果 !isPHP && (phpcode[i->5] == '那么 isPHP = 真 elseif isPHP && (phpcode[i->2] == '?>') then isPHP = 假 elseif isPHP && !(isSingleQuote || isDoubleQuote) && !(isSingleComment || isMultiComment) && (phpcode[i->2] == '/*') 那么 isMultiComment = true cmets.add(""); elseif isPHP && !(isSingleQuote || isDoubleQuote) && !(isSingleComment || isMultiComment) && (phpcode[i->2] == '//') 然后 isSingleComment = true cmets.add(""); elseif isPHP && isMultiComment && (phpcode[i->2] == '*/') 然后 isMultiComment = false elseif isPHP && isSingleComment && (phpcode[i->1] == '\n') 然后 isSingleComment = 假 elseif isPHP && !(isSingleQuote || isDoubleQuote) && !(isSingleComment || isMultiComment) && (phpcode[i->1] == '"') 那么 isDoubleQuote = true elseif isPHP && isDoubleQuote && (phpcode[i->1] == '"') 那么 isDoubleQuote = 假 elseif isPHP && (isSingleComment || isMultiComment) 然后 cmets[cmets.count - 1] += phpcode[i]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      相关资源
      最近更新 更多