Shell中运行PHP7兼容性检查grep正则报错,修改后是否正确?
问题分析与修正方案
你的修改后的正则表达式并不正确,咱们一步步拆解问题,然后给出能准确匹配目标模式的正确写法:
先明确核心需求
你要找的是PHP代码中类似 ->$变量名[索引](参数) 的语法——这类写法在PHP7中因为解析优先级变化会存在兼容性问题,所以需要准确定位。
你的修改版正则的问题点
- 错误使用HTML实体:
\-\>里的>是HTML转义字符,Shell/grep不需要这个,你实际要匹配的是字面的->,直接写即可。 $未转义:正则里的$是行尾锚点,你要匹配的是PHP变量的$符号,必须转义成\$,否则$.+会匹配行尾后的内容,完全偏离目标。- 数组索引的正则写错:你写的
[.+]是「字符集」,意思是匹配.或+其中一个,而不是匹配完整的[...]数组索引结构,正确的写法应该是\[[^]]+\](匹配任意非]的内容包裹在方括号里)。 - BRE模式下括号未转义:grep默认使用基础正则表达式(BRE),此时
(.*)只会匹配字面的(和),要表示「匹配括号内任意内容」,需要转义成\(.*\)。 - 开头的
-导致grep误判选项:你最初的错误「invalid option -- '>'」,是因为grep把以-开头的正则当成了命令选项,这个问题需要通过--标记选项结束,或者用-e参数指定正则来解决。
正确的grep命令写法
方案1:使用基础正则(BRE),用--避免选项误判
grep -rl -- "->\$[^[]+\[[^]]+\]\(.*\)" .
方案2:使用扩展正则(ERE),语法更简洁(加-E参数)
grep -rlE -- "->\$[^[]+\[[^]]+\](.*)" .
正则各部分解释
->:匹配PHP对象调用的箭头符号(用--后无需转义开头的-)\$:匹配PHP变量的$符号[^[]+:匹配一个或多个非[的字符(即变量名,避免过度贪婪到数组索引的[)\[[^]]+\]:匹配完整的数组索引结构(比如[foo]、[$bar])\(.*\)(BRE)/(.*)(ERE):匹配方法调用的括号及内部参数
这样修改后,就能准确找到你要排查的PHP7不兼容语法了。
内容的提问来源于stack exchange,提问作者Arnie
相关产品推荐
相关产品推荐

