質問: '(([^()]+)|(?R))'; preg_match_all("/$pattern/x",$str,$match,PREG_PATTERN_ORDER); print_r($match); と書いたのですが、結果は Array ( [0] => Array ( [0] => (日本語) [1] => (またはさしすせそ) ) [1] => Array ( [0] => (日本語) [1] => (またはさしすせそ) ) ) で、「(ひらがな(日本語)の場合。)」を拾ってくれません。 どのように記載すればよいのか、ご教授ください。
回答: その例の半角括弧を全角括弧に直すとこうなります。全角文字があるので、utf-8の修飾子`u`も指定します。 ``` $pattern = '(((?>[^()]+)|(?R))*)'; preg_match_all("/$pattern/ux",$str,$match,PREG_PATTERN_ORDER); ``` 追記: 得られた文字列をさらに処理する。 ``` $str = "あいうえお(ひらがな(日本語)の場合。)は、かきくけこ(またはさしすせそ)より手前である。"; function foo($str){ $pattern = '((((?>[^()]+)|(?R))*))'; if(preg_match_all("/$pattern/ux",$str,$match,PREG_PATTERN_ORDER)){ $result = array(); foreach($match[0] as $i => $s){ array_push($result,$s); $result = array_merge($result,foo($match[1][$i])); } return $result; }else{ return array(); } } $result = foo($str); print_r($result); ``` 配列関数を熟知していたら、もうちょっとスマートに書けるような気がします。