python正则匹配代码注释

0x00 需求

由于某需求,所以需要使用python正则匹配php文件中的注释并替换为空。

0x01 对于utf8编码文件的处理代码以及出现的问题

m = re.compile(r'//.*')
outtmp = re.sub(m, ' ', content)m = re.compile(r'/\*.*?\*/', re.S)
result = re.sub(m, ' ', outtmp)

对于utf-8编码的文件,我们可以使用上述代码块对///* */两种类型的php注释进行匹配替换,但是存在的问题是,对于一些只能使用二进制模式读取的文件,使用上述代码块无法正确匹配//这种类型的注释,举个例子,下面是我需要进行匹配的文件的部分代码

<?php
//Starting calls
if (!function_exists("getmicrotime")) {function getmicrotime() {list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec);}}
error_reporting(5);
@ignore_user_abort(TRUE);
@set_magic_quotes_runtime(0);
$win = strtolower(substr(PHP_OS,0,3)) == "win";
...
注:该文件后面存在无法使用utf8编码的部分,因此无法使用诸如encoding = 'utf-8'的方法来进行文件读取

在使用’rb’方法读取文件内容后,其呈现的字符串是这样的:

b'<?php\n//Starting calls\nif (!function_exists("getmicrotime")) {function getmicrotime() {list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec);}}\nerror_reporting(5);\n@ignore_user_

可以看到文件内容已经变成一行,如果使用上文提到的代码块进行处理,其结果就是

<?php\n

后面的内容将会被全部替换为空

0x02 解决问题

在一开始尝试使用

m = re.compile(r'//.*\\n')

来进行匹配,发现其匹配结果依然是

<?php\n

经查,其原因是
特殊字符*在进行匹配的时候,采取的是贪婪方式匹配,举个例子

使用正则式 <.*> 对字符串'<a> b <c>'进行匹配,它将会匹配整个字符串,而不仅是 '<a>'

因此,使用如下的模式来进行匹配

m = re.compile(r'//.*?\\n')

在增加了?之后,匹配模式会变成非贪婪方式,因此满足我们的需求
即最终的代码是

m = re.compile(r'//.*?\n')
outtmp = re.sub(m, ' ', content)m = re.compile(r'/\*.*?\*/', re.S)
result = re.sub(m, ' ', outtmp)

本文链接:https://my.lmcjl.com/post/15281.html

展开阅读全文

4 评论

留下您的评论.