在单引号字符串中查找$ variables的所有实例?

时间:2017-01-30 18:47:44

标签: php regex string phpstorm

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

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

$query .= '($length)';

etc.

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

是否有正则表达式或PhpStorm的某些功能,我可以使用它来查找所有这些实例并修复它们,或者通过还原到"或使用'连接?

1 个答案:

答案 0 :(得分:0)

所以你想找到包含$的单引号字符串文字。显而易见的是:

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

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

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

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

'foo' . $bar . 'baz'

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

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

<强>注意事项:

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