PHPで複数文字からなる区切り記号から最長と最短を取得する

はじめに

複数文字からなる区切り文字から最短と切り出す場合に少しだけつまったので、最長と最短の場合の正規表現を記録しておきます。

コード

最長は、戸惑うこと無く以下のパターンで得られます。

$subject = "abc|S|def|||S|||SS||ghi|S|jkl";
$format = "/\|S\|(.*)\z/";
preg_match($format,$subject,$matches);
print $matches[1]; // => "def|||S|||SS||ghi|S|jkl"

最短は、区切り文字の前に".*"を付けて対応しました。

$subject = "abc|S|def|||S|||SS||ghi|S|jkl";
$format = "/.*\|S\|(.*)\z/";
preg_match($format,$subject,$matches);
print $matches[1];  // => "jkl"

最短をとろうとしたけど、失敗した例。
"?"を付けて最短にしようと思ったけど、うまくいかない。

$format = "/\|S\|(.*?)\z/";
preg_match($format,$subject,$matches);
print $matches[1]; // => "def|||S|||SS||ghi|S|jkl"

preg_matchを使ったらどうにかなるのではないかと思って試した例。

// preg_match_allを使ってもよくわからない。
$format = "/\|S\|.*?\z/";
preg_match_all($format,$subject,$matches);
var_dump($matches);
// array(1) {
//   [0]=>
//   array(1) {
//     [0]=>
//     string(26) "|S|def|||S|||SS||ghi|S|jkl"
//   }
// }

おわりに

たいしたことではないのですが、メモ程度に。
正規表現は、部分文字列をうまく使ったらかなり楽になりますね。