例えば、「ファイル1」という文字列を「ファイル2」へ置換する場合。
// 失敗 preg_replace( '/(\d+)$/', '$2 + 1', 'ファイル1' ); // 成功 preg_replace( '/(\d+)$/e', '"$2" + 1', 'ファイル1' );
重要なのは修飾子「e」。
PHP: 正規表現パターンに使用可能な修飾子 – Manual
- e (PREG_REPLACE_EVAL)
この修飾子を設定すると、preg_replace()
は、置換文字列において後方参照に関する通常の置換を行った後、PHP コードとして評価し、検索文字列を置換するためにその結果を使用します。置換された後方参照においては、単引用符や二重引用符、バックスラッシュ (\)および NULL 文字はバックスラッシュでエスケープされます。
で、僕が本当にやりたかったのは「ファイル名-1」を「ファイル名-2」へと置換すること。-(ハイフン)がマイナスと判定されるので少し戸惑った。解決法は以下。
// 計算する部分を()で囲む preg_replace( '/(-)(\d+)$/e', '"$1".("$2" + 1)', 'ファイル名-1' )
バックスラッッシュつけたりいろいろやって上記で解決。引用符も試行錯誤でエラーが出なくなったものを掲載してるので、もっとスマートな囲み方があるかも。