2017-01-30 6 views
2

"のすべてまたはほとんどのインスタンスを'に置き換えて、誰かがレポを変更して文字列を割り当てました。これは、解析変数である多くの文字列を壊すという意図しない影響を与えています。例:

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

$query .= '($length)'; 

etc. 

明らかにこれは、SQLクエリを破壊されたが、それは$queryに割り当てられた文字列だけに限定されないことがあります。

phpstormの機能がありますか?"に戻すか、連結して'を使用して、すべてのインスタンスを見つけて修復できますか?

+0

最高の修正点は、コミットをチェックインした人物を見つけて、コードのすべての行を調べ、公正な罰として手作業で修正することです。その後、それらが完了したら、repoをロールバックして、後続のコミットからすべてのコードを書き直し、それらをチェックインして最新のものに戻します。その後、それらを発砲する。 –

+0

ハハ - 幸運にもそれは生産には至らなかったし、ほとんどのインスタンス*はもともとキャッチされ、手動で手動で修正されていた。私はちょうど1つのファイルの中でいくつかのファイルに遭遇し、それらがコードベース全体のどこにも存在しないことを確認したい。 – ShaneOH

答えて

0

したがって、$を含む一重引用符で囲まれた文字列リテラルを検索する必要があります。しようとする明白なことは、これを次のようになります。$を含む任意の単一引用符で囲まれた文字列を見つける必要があります

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

。残念ながら、バックスラッシュでエスケープされた文字がある可能性があるため、これはうまくいきません。だから、これはわずかに良いです:

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

しかし、別の問題は、あなたがこのようなものかもしれません以上があるかもしれないということです。

'foo' . $bar . 'baz' 

をし、その正規表現が' . $bar . 'と一致します。このラウンドを取得するために、我々は$を含む最初の単一引用符で囲まれた文字列リテラルまで、行の先頭から部分と一致する正規表現を書くことができ:

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

警告:

  • Iこれらをテストしていないので、正しくない可能性があります。
  • 私のPHPは少し錆びているので、文字列リテラルがどのように見えるのかは分かりません。
  • 正規表現をどのように実行しているのかわかりません。文字列リテラルから正規表現のコンストラクタを使用している場合は、エスケープ文字の余分なレイヤーが必要です(例:/\\/new RegExp('\\\\')と同じです)。
  • おそらくmと呼ばれるフラグを設定する必要があります(使用している正規表現エンジンはわかりません)。^の最初はすべての行の先頭に一致します。文字列。同様に、.に改行を一致させたくないので、sと呼ばれるかもしれないフラグを解除してください。
  • 私が考えていないいくつかの不明瞭なケースがあるかもしれません。理論的には、置き換えたくないケースを含むコードコメントが存在する可能性があります。
関連する問題