ホーム > ブログ [果報は寝て待て] > preg_match でバックスラッシュをマッチング

ブログ [果報は寝て待て]|Blog

preg_match でバックスラッシュをマッチング

2012年2月4日 14:30

こんにちは。
久しぶりにPHP関数でハマってあたふたしてた掛尾です(汗

先日、とあるところでバックスラッシュをマッチングさせようと preg_match を使用した時のこと…。

<?php
$subject = 'test\test.test';
preg_match( '/([^\\]*)\\([^\\]*)$/', $subject, $matches );
 
var_dump( $matches );
?>

こんな感じのコードを書いたんですが…。
期待してた結果は

array(3) {
  [0]=>
  string(14) "test\test.test"
  [1]=>
  string(4) "test"
  [2]=>
  string(9) "test.test"
}

これだったんですが、なんと・・・エラーでたじゃないですかっ!

Warning: preg_match() [function.preg-match]: Compilation failed: missing terminating ] for character class at offset 16

結果は『NULL』。

何故なんだろう…と思って検索、検索・・・。 ありました。

PHPマニュアル - エスケープシーケンス

注意: シングルクォートあるいはダブルクォートで囲まれた PHP の 文字列 の中では、バックスラッシュは特別な意味を表します。 そのため、正規表現 \\ を使用して \ とマッチさせたい場合は PHP のコード内では "\\\\" あるいは '\\\\' と記述する必要があります。

なるほど・・・。
正規表現の『\\』を文字列としての『\\』にマッチさせる的な考え方なんだろうか…。
なんか考え出すと頭がパニックになりそうだったので、マニュアル通りにしてみました。

<?php
$subject = 'test\test.test';
preg_match( '/([^\\\\]*)\\\\([^\\\\]*)$/', $subject, $matches );
 
var_dump( $matches );
?>

これで期待通りの結果が得られました。

ちなみに、正規表現パターン内のバックスラッシュを、全部3つずつにしても正しい結果が得られたんですが・・・何故なんでしょうか・・・。
なんか不思議な迷路に迷い込みそうなので、またの機会に考えることにしましょう(苦笑

shape DESIGN - シェイプデザイン, 徳島県徳島市名東町, tel/fax 088-635-5859, 営業時間 平日10:00〜18:00

まずはお気軽にお問い合わせください
お問い合わせ・お見積り・ご相談はこちら
お気軽にご相談ください

徳島県徳島市名東町
tel/fax 088-635-5859
営業時間 平日 10:00〜18:00

※打ち合わせ等で不在の場合は、お電話でのお問い合わせに対応できない場合がありますので、ご了承ください。

フォームからのお問い合わせ

徳島・香川・愛媛・高知および大阪・京都を中心にご依頼を承ります。その他の地域でも、メール・お電話・FAX・Skype等での作業が可能であれば柔軟に対応いたします。

  • Become our fan on Facebook, facebook.com/shape.design