質問: preg_match('#^/(.+?)/(.+?)/$#', '/aaaa/bbbb/ccc/', $matches); if($sts) var_dump($matches); 結果) array(3) { [0]=> string(15) "/aaaa/bbbb/ccc/" [1]=> string(4) "aaaa" [2]=> string(8) "bbbb/ccc" } bbbb/cccが最短マッチが効いていない感じがしますが、この場合どの様なパターンを記述すれば良いのでしょか? 宜しくお願いします。 *explode関数ではなく、今回は正規表現にて実現したく考えております。
回答: どうしても切り分けたいなら一番単純なのは[^/]をマッチさせること ``` $str="/aaaa/bbbb/ccc/"; $pattern="#^/([^/]+)/([^/]+)/([^/]+)/$#"; preg_match($pattern,$str,$m); print_r($m); ``` これなら$pattern="#^/([^/]+)/([^/]+)/$#"; にはマッチしません。 追記 === そもそも正規表現を使うのはどちらが目的でしょうか? * パターンマッチさせて合致しないものをはじく * パターンマッチさせて合致したものだけ抽出する それによって使う正規表現もかわってきます。 たとえばもしスラッシュに囲まれた文字列を抽出したいというだけなら 以下のような書き方をするほうが楽です ``` $str="/aaaa/bbbb/ccc/"; $pattern="#(?<=/).+?(?=/)#"; preg_match_all($pattern,$str,$m); print_r($m); ```