2013-06-13 65 views
1

我有一个解析C#中的PHP文件的要求。基本上我需要PHP文件中的所有注释,并且我想使用Google翻译将所有注释翻译成另一种语言。如何使用C#获取PHP文件的所有评论?

我目前正在通过使用正则表达式来做到这一点。但这是徒劳的。如果我解析“//或/ ..” /“我无法确定这两者是否位于一个字符串内。

比方说$i= " http://wwww.google.como " ;。我的正则表达式认为它是注释"//wwww.google.com " ;,但它不是注释。那么有人可以帮我吗?

是否有任何已经构建的帮助我很多,如php解析器等?

+0

它必须是C#中的代码还是其他语言的产品/解决方案可以接受? –

+0

我需要.net。但是如果我说是的话你建议我? –

+0

PHP的词法结构非常复杂,检查字符串文字,然后你可以在PHP中使用HTML文本,最糟糕的情况是可能包含PHP代码。除非你想写一个完整的PHP词法分析器,否则你很可能会弄错,最终会在一些奇怪的文档字符串中找到“//”。这里的另一个答案建议使用PHP本身(它包含一个完整的标记器)来完成这项工作;我认为这是最好的选择。 –

回答

1

创建一个简单的PHP脚本,接受一个PHP脚本文件名和标记化它,你使用token_get_all()

与输出工作后(这是一个令牌流和易于处理)

0

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

 
bool isPHP = false 
bool isMultiComment = false 
bool isSingleComment = false 
bool isSingleQuote = false 
bool isDoubleQuote = false 
string comments[] 

for i := 0 -> phpcode.length() 
    if !isPHP && (phpcode[i->5] == '<?php') then 
     isPHP = true 
    elseif isPHP && (phpcode[i->2] == '?>') then 
     isPHP = false 
    elseif isPHP && !(isSingleQuote || isDoubleQuote) 
       && !(isSingleComment || isMultiComment) 
       && (phpcode[i->2] == '/*') then 
     isMultiComment = true 
     comments.add(""); 
    elseif isPHP && !(isSingleQuote || isDoubleQuote) 
       && !(isSingleComment || isMultiComment) 
       && (phpcode[i->2] == '//') then 
     isSingleComment = true 
     comments.add(""); 
    elseif isPHP && isMultiComment 
       && (phpcode[i->2] == '*/') then 
     isMultiComment = false 
    elseif isPHP && isSingleComment 
       && (phpcode[i->1] == '\n') then 
     isSingleComment = false 
    elseif isPHP && !(isSingleQuote || isDoubleQuote) 
       && !(isSingleComment || isMultiComment) 
       && (phpcode[i->1] == '"') then 
     isDoubleQuote = true 
    elseif isPHP && isDoubleQuote 
       && (phpcode[i->1] == '"') then 
     isDoubleQuote = false 
    elseif isPHP && (isSingleComment || isMultiComment) then 
     comments[comments.count - 1] += phpcode[i] 
相关问题