質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

4548閲覧

再帰的パターンで全角かっこを抽出したい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2016/01/24 12:36

phpの正規表現の再帰的パターンを使って、入れ子になっている全角かっこの文章のすべてを抽出したいと思っています。

http://php.net/manual/ja/regexp.reference.recursive.php

php.netの上記のサイトを見て、
$str = "あいうえお(ひらがな(日本語)の場合。)は、かきくけこ(またはさしすせそ)より手前である。";
$pattern = '(([^()]+)|(?R))';
preg_match_all("/$pattern/x",$str,$match,PREG_PATTERN_ORDER);
print_r($match);

と書いたのですが、結果は
Array (
[0] => Array ( [0] => (日本語) [1] => (またはさしすせそ) )
[1] => Array ( [0] => (日本語) [1] => (またはさしすせそ) )
)

で、「(ひらがな(日本語)の場合。)」を拾ってくれません。

どのように記載すればよいのか、ご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

その例の半角括弧を全角括弧に直すとこうなります。全角文字があるので、utf-8の修飾子uも指定します。

PHP

1$pattern = '(((?>[^()]+)|(?R))*)'; 2 3preg_match_all("/$pattern/ux",$str,$match,PREG_PATTERN_ORDER);

追記:
得られた文字列をさらに処理する。

PHP

1$str = "あいうえお(ひらがな(日本語)の場合。)は、かきくけこ(またはさしすせそ)より手前である。"; 2 3function foo($str){ 4 $pattern = '((((?>[^()]+)|(?R))*))'; 5 if(preg_match_all("/$pattern/ux",$str,$match,PREG_PATTERN_ORDER)){ 6 $result = array(); 7 foreach($match[0] as $i => $s){ 8 array_push($result,$s); 9 $result = array_merge($result,foo($match[1][$i])); 10 } 11 return $result; 12 }else{ 13 return array(); 14 } 15} 16 17$result = foo($str); 18 19print_r($result);

配列関数を熟知していたら、もうちょっとスマートに書けるような気がします。

投稿2016/01/24 13:25

編集2016/01/25 13:13
otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/01/25 03:43

otn様、ご回答ありがとうございます。 参照例の"\(""\)"を"("")"に代えるだけでよかったんですね。 教えていただいた式で出力したところ、 Array ( [0] => Array ( [0] => (ひらがな(日本語)の場合。) [1] => (またはさしすせそ) ) [1] => Array ( [0] => の場合。 [1] => またはさしすせそ ) ) となったのですが、希望は Array ( [0] => Array ( [0] => (ひらがな(日本語)の場合。) [1] => (日本語) [2] => (またはさしすせそ) ) [1] => Array ( [0] => ひらがな(日本語)の場合。 [1] => 日本語 [2] => またはさしすせそ ) ) と取りたいのです。$match[1]以降はなんでもよいのですが。 こういうのは再帰でなく他の方法の方がよいのでしょうか。
otn

2016/01/25 13:09

同じ文字列「(日本語)」を1つの正規表現で複数回マッチさせるのは無理そうに思います。マッチしたら次に進んじゃうので。 関数の再帰呼び出しですかね。追記しておきます。
退会済みユーザー

退会済みユーザー

2016/01/26 11:55

otn様、重ねてありがとうございます。 無事に期待通りの結果を得ることができました。 関数の再帰ははじめ考えたのですが、うまく実現できなかったのであきらめてしまいました。これで先に進めます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問