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 评论