aswww log

エンジニアの技術録。アプリとかウェブとか

PHP正規表現でエスケープがうまくいかなったらバックスラッシュを使おう

とあるサイトのスクレイピングバッチを作成している最中、正規表現で思わぬとこでハマったのでメモ。

○事象
文字列"$(initLive);"を空文字に置換(つまり削除)したかった。以下のとおり実装。

preg_replace("#[\$]\(initLive\);#", '', $contents)))));

デリミタは一般に"/"(スラッシュ)がよく使われるけど、今回はテキストHTML相手なのでエスケープもめんどくさいし、"#"(ナンバー記号)を使用。"$"(ダラー)と"("(前括弧)と")"(後括弧)は文字列として判定してほしいので"\"(円マーク)でエスケープする。
しかしこれで実行してもエラーが出てしまった。

どう考えても構文は間違っていない...そこでひとつ気になったことが。以前の仕事でCentOS上で正規表現使った時、"\"(バックスラッシュ)でエスケープしたような。
試しに"\"(円マーク)を"\"(バックスラッシュ)で打ちなおしてみる。

preg_replace("#[\$]\(initLive\);#", '', $contents)))));

見かけ全然変わらないけど、再度実行したらいけました。
外見は同じでも内部では文字コードで判別してるのね。そうだよね、見かけに騙されちゃダメだよね。
でも以前Windowsで実装してた時は\(円マーク)でいけた気がするんだけどな?UbuntuLinux仕様なのか?