正規表現でちょっと気になったのでメモ。
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
どっちでもよかった。意味がわからん。誰か教えてください。
以上
文字列リテラルでバックスラッシュを表現するには基本的に2個重ねるのだが,後ろに来る文字によっては1個でも構わないという罠らしい.
[よくわかる解説]
http://d.hatena.ne.jp/x768/20060607
うおぉ!何打この罠は!
>ただし,後ろに来る文字によっては1個でも構わないが,不規則なので間違えやすい。
なるほど、納得した。やっぱPerlだな。
http://blumunki.com/css/60.htmlレベッカミンコフ バッグ REBECCA MINKOFF HF14ISSS01 375 AMOROUS SATCHEL ショルダーバッグ PETROL/LIGHT GOLD【new1010】:1&one
http://www.e-f-munkegaarden.dk/a/73.htmlレベッカミンコフ バッグ REBECCA MINKOFF HF34IFCX02 609 MINI 5ZIP ショルダーバッグ BURGUNDY/LIGHT GOLD【new0131】:1&one