MTの管理画面で検索/置換をして$1だらけにしてしまう件

公開

Movable Typeの管理画面で検索/置換を利用する際、正規表現にチェックを入れて置換をすることがあるのですが、置換文字列に$1を書いて、置換結果が$1だらけになることがあります(笑) 例えば、タイトルの特定の文字を消し、(.*?)でマッチした部分を残したい場合です。

書き方が違うという可能性を考えつつ昨夜ソースを探ってみたところ、lib/MT/CMS/Search.pmの1806行目付近に次のようなコードがありました。

$text =~ s!$re!$replace!g

そこで、Perl初心者ながら$replace$1等は使えないのかと調べてみたところ、「regex - How to use a variable in the replacement side of the Perl substitution operator? - Stack Overflow」の記事を見つけました。結論としては、今のコードではマッチした文字を使うことは無理なようです。$text =~ s!$re!$replace!geeのように、オプションでeeを指定すると意図した動作--マッチした文字が使えるようです。

というわけで、FogBugzにCase 113843を作成して機能リクエストさせて頂きました。ご検討よろしくお願いします。

ちなみにregex_replaceフィルタは、eval '$str =~ s/$re/' . $replace . '/' . ( $global ? 'g' : '' );のような実装なのでマッチした文字が使えるのだと思います。