PHPトリビアルメモ2(正規表現)

正規表現でちょっと気になったのでメモ。

1.ダブルクオートとかシングルクオートとか


$string = " abcd123  xyz !#%";

$splitted = preg_split("/\\s+/", $string);
var_dump($splitted);

$splitted = preg_split('/\\s+/', $string);
var_dump($splitted);

$splitted = mb_split("\\s+", $string);
var_dump($splitted);

結果は全部下。ダブルクオートだろうが、シングルクオートだろうが関係ないらしいですよ。\\の数。


array(4) {
  [0]=>
  string(0) ""
  [1]=>
  string(7) "abcd123"
  [2]=>
  string(3) "xyz"
  [3]=>
  string(3) "!#%"
}

2.\\のマッチング
なんで1.のようなことを気にしたかというと、PHPマニュアルに

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

って書いてあったから。え、4つもいるの?ってわけでやってみたら、4ついりました。


$string2 = '\\\\';  // バックスラッシュ2つ

if (preg_match('/\\\\\\\\/', $string2, $matches)) {  // バックスラッシュ4つ
	echo "match:". $matches[0] . "\\n";
}

結果。(バックスラッシュ1個)


match:\\

これは実は、例えば先日書いたGRETAでも同じことです。バックスラッシュはエスケープに用いられるため、バックスラッシュ自体のエスケープが必要で、クオート内のバックスラッシュ2個重ねてはじめて正規表現の世界でバックスラッシュ1個分の意味を成すわけです。つまり、’\\\\’とソース上はバックスラッシュ4個でも、メモリ上は’\\’とバックスラッシュ2個ということになります。正規表現の世界でもバックスラッシュはエスケープ文字として使われるため、これで初めてバックスラッシュ1個をあらわす正規表現となると思われます。(意味が通じているか心配)
なわけで、1.でやってる”\s”が気になりました。正規表現の世界で空白文字を表すには”\s”なわけですから、1.では本当は”\\s”と書くべきなんじゃないのか?と、そこで、

3.\\wのマッチング


$string = " abcd123  xyz !#%";

if (preg_match('/\\w+/', $string, $matches)) {
	echo "match:". $matches[0] . "\\n";
}
if (preg_match('/\\\\w+/', $string, $matches)) {
	echo "match:". $matches[0] . "\\n";
}

結果。


match:abcd123
match:abcd123

どっちでもよかった。意味がわからん。誰か教えてください。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: PHP パーマリンク

PHPトリビアルメモ2(正規表現) への4件のフィードバック

  1. o-taki のコメント:

    文字列リテラルでバックスラッシュを表現するには基本的に2個重ねるのだが,後ろに来る文字によっては1個でも構わないという罠らしい.

    [よくわかる解説]
    http://d.hatena.ne.jp/x768/20060607

  2. コスミー のコメント:

    うおぉ!何打この罠は!
    >ただし,後ろに来る文字によっては1個でも構わないが,不規則なので間違えやすい。
    なるほど、納得した。やっぱPerlだな。

  3. http://blumunki.com/css/60.htmlレベッカミンコフ バッグ REBECCA MINKOFF HF14ISSS01 375 AMOROUS SATCHEL ショルダーバッグ PETROL/LIGHT GOLD【new1010】:1&one

  4. http://www.e-f-munkegaarden.dk/a/73.htmlレベッカミンコフ バッグ REBECCA MINKOFF HF34IFCX02 609 MINI 5ZIP ショルダーバッグ BURGUNDY/LIGHT GOLD【new0131】:1&one

コメントを残す

メールアドレスが公開されることはありません。