Php 是否在单引号字符串中查找$variables的所有实例?
有人对repo进行了更改,将Php 是否在单引号字符串中查找$variables的所有实例?,php,regex,string,phpstorm,Php,Regex,String,Phpstorm,有人对repo进行了更改,将“的所有或大部分实例替换为”,以分配字符串。这产生了意外的效果,破坏了许多解析变量的字符串。示例: $query = 'ALTER TABLE ' . $items . ' ADD `user_$name`'; $query .= '($length)'; etc. 显然,这破坏了SQL查询,但可能不仅仅限于分配给$query的字符串 是否有一个正则表达式或PhpStorm的某个函数,我可以使用它来查找所有实例并修复它们,方法是返回到“,或者使用带有连接的” 所
“
的所有或大部分实例替换为”
,以分配字符串。这产生了意外的效果,破坏了许多解析变量的字符串。示例:
$query = 'ALTER TABLE ' . $items . ' ADD `user_$name`';
$query .= '($length)';
etc.
显然,这破坏了SQL查询,但可能不仅仅限于分配给$query
的字符串
是否有一个正则表达式或PhpStorm的某个函数,我可以使用它来查找所有实例并修复它们,方法是返回到
“
,或者使用带有连接的”
所以您希望查找包含$
的单引号字符串文本。最明显的尝试是:
/'[^'$]*[$][^']*'/
应该可以找到任何包含$
的单引号字符串。不幸的是,这不太管用,因为可能有反斜杠转义字符。所以这稍微好一点:
/'(?:[^'$]|\\.)*[$](?:[^']|\\.)*'/
但另一个问题是,可能有更多类似的东西:
'foo' . $bar . 'baz'
并且该正则表达式将匹配”$酒吧。”代码>。为了解决这个问题,我们可以编写一个正则表达式,从一行的开头到第一个包含$
的单引号字符串文本,都匹配一个子字符串:
/^(?:[^']|'(?:[^\\']|\\.)*')*'(?:[^'$]|\\.)*[$](?:[^']|\\.)*'/
注意事项:
- 我还没有测试过这些,所以它们可能不太正确
- 我的PHP有点生疏,所以我不确定字符串文字应该是什么样子
- 我不知道你是怎么管理regex的;如果从字符串文本使用正则表达式构造函数,则需要额外的字符转义层(例如,在javascript中,
/\\/
相当于新正则表达式(“\\\\”)
)
- 您可能需要设置一个标志,可能称为
m
(同样,我不知道您使用的是什么正则表达式引擎),这样初始的^
将在每一行的开头匹配,而不仅仅是字符串的开头;同样,取消设置可能被称为s
的标志,因为您不希望
匹配换行符
- 可能有一些我没想到的不太清楚的情况。理论上可能存在代码注释,其中包含您不想替换的案例
最好的解决办法是找出谁签入了提交,让他们检查每一行代码并手动修复,作为一种公正的惩罚。然后,当它们完成时,回滚repo,然后让它们重写后续提交中的所有代码,并检入这些代码以将其恢复到当前状态。在那之后,解雇他们。哈哈——幸运的是,它不是在生产中,大多数实例最初是被捕获并手动修复的。我刚刚在一个文件中遇到了一对,我想检查一下,确保它们不在整个代码库的其他地方。