PHPについて質問です。

文字列の中の[[と]]を削除するにはどうしたら良いのでしょうか?

例えば [[東京]] の 東京だけ抽出するということです。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2008/08/31 01:27:01
  • 終了:2008/08/31 21:47:11

回答(2件)

id:m_nagase No.1

nagase回答回数58ベストアンサー獲得回数82008/08/31 01:52:15

ポイント35pt

正規表現で [[なんらかの文字列]] というパターンにマッチさせて、サブパターンで "なんらかの文字列" の部分を抜き出せば良いのです。

$str = '[[東京]][[大阪]][[名古屋]][札幌][[福岡]][[横浜]]';
$pattern = '\[\[(.*?)\]\]';
$i=preg_match_all('/'.$pattern.'/i',$str,$matches);
for ($j=0; $j<$i; $j++){
  print $matches[1][$j];
}

正規表現では[]文字クラス用のメタキャラクタなので\を付けてエスケープ、()で囲まれた部分がサブパターンとなります。

サブパターン中の.*?は改行文字を除く任意の1文字に0回以上マッチすると言う意味です。

preg_match_all は指定された文字列から全ての一致するパターンを抜き出して配列に格納します。

サブパターンが1ヶ所指定されているので、1回のパターンマッチで全体のパターンマッチ $maches[0] とサブパターン $maches[1] の二つの結果が獲られ、目的の文字列はサブパターンの方に格納されます。

id:taroemon

ご回答ありがとうございます。

解説及びコメントが大変参考になりました。

2008/08/31 21:46:52
id:Rewish No.2

rewish回答回数9ベストアンサー獲得回数32008/08/31 01:57:14

ポイント35pt

[[と]]が固定であれば、置換で簡単に実装できます。

<?php
// 対象文字列
$str = '[[東京]]';

// [[と]]の間の文字列だけ抜き取る
$str = preg_replace('/\[\[(.*)\]\]/', '$1', $str);

// 表示
echo $str; // 東京

複数行に対象文字列がある場合でも抽出可能です。

<?php
// 複数行の文字列
$str = <<< EOM
[[東京]]
[[大阪]]
[[北海道]]
EOM;

// [[と]]の間の文字列だけ抜き取る
$str = preg_replace('/\[\[(.*)\]\]/', '$1', $str);

// 表示
echo $str; // 東京 大阪 北海道

PHP: preg_replace - Manual

id:taroemon

ご回答ありがとうございます。

うまくいきました。

2008/08/31 21:47:05
  • id:tezcello
    答えは出ているようなので、補足情報を。

    > サブパターン中の.*?は改行文字を除く任意の1文字に0回以上マッチすると言う意味です
    .*? は、改行文字を除く任意の文字列に「なるべく少ない回数(=最短で)」マッチする
    の方が適切では? > m_nagase さん

    「改行文字を除く任意の文字」には、[ , ] 共に含まれています。
    なので、 .* だけだと 
    $str = '[[東京]][[大阪]][[名古屋]][札幌][[福岡]][[横浜]]'; の場合は、
    "東京]][[大阪]][[名古屋]][札幌][[福岡]][[横浜" の部分がマッチする事になります。
      つまり、¥]¥] が横浜の後ろにマッチしてしまう。
    これを避ける為に、東京のうしろの ]] にマッチする(=最短でマッチする)ように、? を付加します。

    1行に1回しか出てこない事が確定ならば、この辺りの検討は不要で、Rewish さんのように .* のみでOKです。

    [[ , ]] に挟まれた部分に改行が含まれる可能性があるなら、パターン文字列を
    /¥[¥[(.*?)¥]¥]/s
    のようにして . が改行文字を含む任意の1文字を意味するようにする必要があります。
       m_nagase さんは修飾子として i を指示されていますが、今回は不要と思います。

  • id:m_nagase
    tezcelloさん、仰せの通りでございます。
    過去に書いたコードを改変してコピペしたので、チェックが甘かったですね。
    寝ぼけながら書くと駄目ですね。
  • id:taroemon
    tezcelloさん
    いつも丁寧な解説ありがとうございます。
    大変参考になりました。

    m_nagaseさん
    再度のコメントありがとうございます。
    大変参考になりました。またよろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません