【问题标题】:Find all instances of $variables in single-quoted strings?在单引号字符串中查找 $variables 的所有实例?
【发布时间】:2017-06-16 01:06:17
【问题描述】:

有人对 repo 进行了更改,将所有或大部分 " 实例替换为 ' 以分配字符串。这产生了破坏许多正在解析变量的字符串的意外影响。例子:

$query = 'ALTER TABLE ' . $items . ' ADD `user_$name`';

$query .= '($length)';

etc.

显然这会破坏 SQL 查询,但它可能不仅限于分配给 $query 的字符串。

是否有一个正则表达式或 PhpStorm 的某些函数可以用来查找所有实例并修复它们,或者通过恢复到" 或使用' 连接?

【问题讨论】:

  • 最好的解决办法是找出谁签入了提交,让他们检查每一行代码并手动修复它作为公正的惩罚。然后,当他们完成后,回滚 repo,然后让他们重写后续提交的所有代码,并将其签入以将其恢复到当前状态。之后,解雇他们。
  • 哈哈——幸运的是,它并没有投入生产,大多数实例最初捕获并手动修复。我刚刚在一个文件中遇到了一对,并想通过确保它们不在整个代码库中的其他地方。

标签: php regex string phpstorm


【解决方案1】:

所以您想查找包含$ 的单引号字符串文字。显而易见的尝试是这样的:

/'[^'$]*[$][^']*'/

这应该会找到任何包含$ 的单引号字符串。不幸的是,这并不完全有效,因为可能存在反斜杠转义字符。所以这稍微好一点:

/'(?:[^'$]|\\.)*[$](?:[^']|\\.)*'/

但另一个问题是,可能有比你可能拥有的更多这样的东西:

'foo' . $bar . 'baz'

并且该正则表达式将匹配' . $bar . '。为了解决这个问题,我们可以编写一个正则表达式,匹配从行首到包含$的第一个单引号字符串文字的子字符串:

/^(?:[^']|'(?:[^\\']|\\.)*')*'(?:[^'$]|\\.)*[$](?:[^']|\\.)*'/

注意事项:

  • 我没有测试过这些,所以它们可能不太正确。
  • 我的 PHP 有点生锈,所以我不确定字符串文字应该是什么样子。
  • 我不知道您是如何运行正则表达式的;如果您使用来自字符串文字的正则表达式构造函数,则需要额外的字符转义层(例如,在 javascript 中,/\\/ 等效于 new RegExp('\\\\'))。
  • 您可能必须设置一个标志,可能称为m(同样,我不知道您使用的是什么正则表达式引擎),以便初始^ 将在每一行的开头匹配,而不是只是字符串的开头;同样,取消设置可能称为 s 的标志,因为您不希望 . 匹配换行符。
  • 可能有一些我没有想到的晦涩案例。理论上可能存在包含您不想替换的案例的代码注释。

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多