preg_match でバックスラッシュをマッチング
2012年2月4日 14:30
こんにちは。
久しぶりにPHP関数でハマってあたふたしてた掛尾です(汗
先日、とあるところでバックスラッシュをマッチングさせようと preg_match を使用した時のこと…。
$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 のコード内では "\\\\" あるいは '\\\\' と記述する必要があります。
なるほど・・・。
正規表現の『\\』を文字列としての『\\』にマッチさせる的な考え方なんだろうか…。
なんか考え出すと頭がパニックになりそうだったので、マニュアル通りにしてみました。
$subject = 'test\test.test'; preg_match( '/([^\\\\]*)\\\\([^\\\\]*)$/', $subject, $matches ); var_dump( $matches );
これで期待通りの結果が得られました。
ちなみに、正規表現パターン内のバックスラッシュを、全部3つずつにしても正しい結果が得られたんですが・・・何故なんでしょうか・・・。
なんか不思議な迷路に迷い込みそうなので、またの機会に考えることにしましょう(苦笑
徳島県徳島市名東町
tel/fax 088-635-5859
営業時間 平日 10:00〜18:00
※打ち合わせ等で不在の場合は、お電話でのお問い合わせに対応できない場合がありますので、ご了承ください。
徳島・香川・愛媛・高知および大阪・京都を中心にご依頼を承ります。その他の地域でも、メール・お電話・FAX・Skype等での作業が可能であれば柔軟に対応いたします。