2012/04/03

正規表現 パターン の話?


いつも忘れるので。。。
まづ、正規表現でいくつかのパターンがあるときに括弧()を使う
$string = "red sox";
$pattern = '/((s|b)ox)/';
$result = preg_match($pattern, $string, $matches);
var_dump($result);
var_dump($matches);
これをパターン内で参照したい時は \nで表す
$pattern = '/(((s|b)ox)(black|white)\2)/';
-「n」は括弧の順番番号 外側から&左から数える ()=1 ()=2 ()=3 ()=4
<?php
$string = "red sox, blacksox";
$pattern = '/(((s|b)ox), (black|white)\2)/';
$result = preg_match($pattern, $string, $matches);
var_dump($result);
var_dump($matches);
?>
==========結果
int(1)
array(5) {
[0]=> string(13) "sox, blacksox"
[1]=> string(13) "sox, blacksox"
[2]=> string(3) "sox"
[3]=> string(1) "s"
[4]=> string(5) "black"
}
(?imsx-imsx:pattern) (?imsx-imsx)で正規表現オプション変更が出来る
<?php
$string = "red Sox, blackSox";//大文字を混ぜてみる
$pattern = '/(((s|b)ox), (black|white)\2)/';
$result = preg_match($pattern, $string, $matches);
var_dump($result);
var_dump($matches);
?>
==========結果
int(0)
array(0) {
}
<?php
$string = "Red Sox, blackSox";
$pattern = '/(((?i)(s|b)ox), (black|white)\2)/';//オプション変更 i=大小文字無視
$result = preg_match($pattern, $string, $matches);
var_dump($result);
var_dump($matches);
?>
==========結果
int(1)
array(5) {
[0]=> string(13) "Sox, blackSox"
[1]=> string(13) "Sox, blackSox"
[2]=> string(3) "Sox"
[3]=> string(1) "S"
[4]=> string(5) "black"
}
<?php
$string = "red Sox, blackSox";
$pattern = '/(((?i:s|b)ox), (black|white)\2)/';//オプション変更
$result = preg_match($pattern, $string, $matches);
var_dump($result);
var_dump($matches);
?>
==========結果
int(1)
array(4) {
[0]=> string(13) "Sox, blackSox"
[1]=> string(13) "Sox, blackSox"
[2]=> string(3) "Sox"
[3]=> string(5) "black"
}
※(?imsx-imsx:pattern)で記述すると 後方参照のキャプチャにカウントされなくなる!
※値をキャプチャする必要はないが、グループ分けのために サブパターンを複数用いたい時に便利
★おまけ★バックスラッシュの後に 数字が続くものはすべて後方参照番号の可能性があるものとして解釈されるので、後に数字が続く場合、後方参照を終了するためになんらかの区切り文字を 置く必要があるる
<?php
$string = "Red Sox, blackSox999";
$pattern = '/(((?i)(s|b)ox), (black|white)\2(?#)999)/';//コメントを区切りにする
$result = preg_match($pattern, $string, $matches);
var_dump($result);
var_dump($matches);
?>
参照)